<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.3.2 (Python 3.9.6 on darwin)" generated="2026-05-28T22:41:02.791309" 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-28T22:41:02.882267" 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-28T22:41:02.882170" elapsed="0.000114"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:02.882469" 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-28T22:41:02.882411" elapsed="0.000077"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:02.882327" elapsed="0.000176"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:02.882562" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:02.882514" elapsed="0.000070"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:02.882316" elapsed="0.000276"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:02.882863" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:02.882812" elapsed="0.000068"/>
</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-28T22:41:02.882964" 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-28T22:41:02.883011" 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-28T22:41:02.883054" 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-28T22:41:02.883096" 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-28T22:41:02.883141" elapsed="0.000007"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:02.882905" elapsed="0.000264"/>
</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-28T22:41:02.883237" 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-28T22:41:02.883285" 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-28T22:41:02.883331" 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-28T22:41:02.883377" 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-28T22:41:02.883422" 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-28T22:41:02.883466" 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-28T22:41:02.883512" 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-28T22:41:02.883558" 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-28T22:41:02.883603" elapsed="0.000007"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:02.883178" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:02.883970" 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-28T22:41:02.883670" elapsed="0.000318"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:02.884282" 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-28T22:41:02.884030" elapsed="0.000269"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:02.884610" 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-28T22:41:02.884342" elapsed="0.000286"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:02.884929" 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-28T22:41:02.884673" elapsed="0.000274"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:02.885267" 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-28T22:41:02.884992" elapsed="0.000291"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:02.885610" 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-28T22:41:02.885325" elapsed="0.000302"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:02.885968" 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-28T22:41:02.885715" elapsed="0.000271"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:02.886296" 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-28T22:41:02.886031" elapsed="0.000281"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:02.886640" 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-28T22:41:02.886356" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:02.883632" elapsed="0.003041"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:02.882899" elapsed="0.003783"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:02.886781" 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-28T22:41:02.886720" elapsed="0.000079"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:02.886951" 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-28T22:41:02.886838" elapsed="0.000197"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:02.882711" elapsed="0.004354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:02.887150" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:02.887113" elapsed="0.000054"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:02.881850" elapsed="0.005339"/>
</kw>
<test id="s1-s1-s1-t1" name="获取广告列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:02.888221" 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-28T22:41:02.887924" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:02.888491" elapsed="0.000009"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:02.888282" elapsed="0.000234"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:02.888274" elapsed="0.000251"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:02.888540" elapsed="0.000016"/>
</return>
<msg time="2026-05-28T22:41:02.888628" 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-28T22:41:02.887629" elapsed="0.001011"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:03.727822" 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-28T22:41:03.728815" 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 14:41:03 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': '63ce9b0783b9616c61788e734c9c6459', 'X-Transparent': '00-63ce9b0783b9616c61788e734c9c6459-4b6d6ca85029696b-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': 'a02e049cfee207a7-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":[],"msg":"Success.","msgInfo":{"template":"Success."},"ts":1779979263714} 
 </msg>
<msg time="2026-05-28T22:41:03.729049" 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-28T22:41:03.729563" 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-28T22:41:02.888685" elapsed="0.840933"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.731234" 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-28T22:41:03.730093" elapsed="0.001255"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.732434" level="INFO">${resp_json} = {'code': 0, 'data': [], 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1779979263714}</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-28T22:41:03.731693" elapsed="0.000779"/>
</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-28T22:41:03.732634" elapsed="0.000208"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.733885" level="INFO">${json_str} = {
  "code": 0,
  "data": [],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779979263714
}</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-28T22:41:03.732985" elapsed="0.000976"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.734646" level="INFO">{
  "code": 0,
  "data": [],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779979263714
}</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-28T22:41:03.734246" elapsed="0.000624"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:03.736580" 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-28T22:41:03.735118" elapsed="0.001527"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($data, (list, dict))</arg>
<arg>响应数据应该是列表或字典格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:03.736921" elapsed="0.000586"/>
</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-28T22:41:03.740004" elapsed="0.000673"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.741276" level="INFO">Length is 0.</msg>
<msg time="2026-05-28T22:41:03.741405" 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-28T22:41:03.741013" elapsed="0.000413"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.741668" level="INFO">广告列表包含 0 个广告项</msg>
<arg>广告列表包含 ${length} 个广告项</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:03.741538" elapsed="0.000170"/>
</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-28T22:41:03.741837" elapsed="0.000159"/>
</kw>
<arg>${data}</arg>
<doc>验证广告列表的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:03.739280" elapsed="0.002801"/>
</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-28T22:41:03.738220" elapsed="0.003913"/>
</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-28T22:41:03.742291" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.743686" 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-28T22:41:03.742717" elapsed="0.001224"/>
</kw>
<doc>验证广告列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T22:41:02.887215" elapsed="0.857132"/>
</test>
<doc>广告列表接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:02.800868" elapsed="0.944618"/>
</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-28T22:41:03.753746" 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-28T22:41:03.753516" elapsed="0.000268"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.757591" 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-28T22:41:03.754144" elapsed="0.003562"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:03.753895" elapsed="0.003884"/>
</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-28T22:41:03.758037" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:03.757825" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:03.753867" elapsed="0.004262"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.759052" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:03.758890" elapsed="0.000221"/>
</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-28T22:41:03.759423" elapsed="0.000030"/>
</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-28T22:41:03.759570" 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-28T22:41:03.759700" 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-28T22:41:03.759822" 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-28T22:41:03.759947" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:03.759196" elapsed="0.000888"/>
</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-28T22:41:03.760299" 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-28T22:41:03.760430" 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-28T22:41:03.760559" 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-28T22:41:03.760663" 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-28T22:41:03.760769" 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-28T22:41:03.760870" 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-28T22:41:03.760973" 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-28T22:41:03.761079" 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-28T22:41:03.761190" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:03.760114" elapsed="0.001121"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.761571" 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-28T22:41:03.761343" elapsed="0.000323"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.762067" 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-28T22:41:03.761819" elapsed="0.000297"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.762534" 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-28T22:41:03.762280" elapsed="0.000307"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.762918" 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-28T22:41:03.762718" elapsed="0.000242"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.763262" 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-28T22:41:03.763069" elapsed="0.000232"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.763598" 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-28T22:41:03.763405" elapsed="0.000233"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.763944" 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-28T22:41:03.763741" elapsed="0.000241"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.764284" 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-28T22:41:03.764088" elapsed="0.000235"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.764627" 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-28T22:41:03.764426" elapsed="0.000240"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:03.761256" elapsed="0.003444"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:03.759173" elapsed="0.005549"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.764985" 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-28T22:41:03.764818" elapsed="0.000215"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:03.765427" 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-28T22:41:03.765139" elapsed="0.000467"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:03.758518" elapsed="0.007162"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.765873" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:03.765783" elapsed="0.000133"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:03.752999" elapsed="0.012971"/>
</kw>
<test id="s1-s1-s2-t1" name="获取应用分享信息" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:03.768636" 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-28T22:41:03.768046" elapsed="0.000616"/>
</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-28T22:41:03.769253" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:03.768806" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:03.768789" elapsed="0.000535"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:03.769355" elapsed="0.000036"/>
</return>
<msg time="2026-05-28T22:41:03.769534" 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-28T22:41:03.767258" elapsed="0.002299"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:04.190509" 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-28T22:41:04.190744" 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 14:41:04 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': '1dd73f4401a3fbf66fc7a3fec5ab441a', 'X-Transparent': '00-1dd73f4401a3fbf66fc7a3fec5ab441a-acea58a364ac88aa-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': 'a02e049fcfb1dbcf-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":1779979264179} 
 </msg>
<msg time="2026-05-28T22:41:04.190873" 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-28T22:41:04.191172" 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-28T22:41:03.770256" elapsed="0.420954"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:04.191379" elapsed="0.000073"/>
</return>
<msg time="2026-05-28T22:41:04.191686" 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-28T22:41:03.769684" elapsed="0.422035"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.194071" 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-28T22:41:04.192709" elapsed="0.001563"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.196220" 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-28T22:41:04.194795" elapsed="0.001477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.196697" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:04.196493" elapsed="0.000290"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:04.192110" elapsed="0.005319"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.199187" level="INFO">${json_data} = {'code': 0, 'data': {'path': '/account/register', 'host': 'https://www.bitradex-test.com'}, 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1779979264179}</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-28T22:41:04.198413" elapsed="0.000819"/>
</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-28T22:41:04.199417" elapsed="0.000243"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.199956" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:04.199792" elapsed="0.000204"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T22:41:04.197885" elapsed="0.002177"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.201172" level="INFO">${json_data} = {'code': 0, 'data': {'path': '/account/register', 'host': 'https://www.bitradex-test.com'}, 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1779979264179}</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-28T22:41:04.200625" elapsed="0.000578"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.201785" level="INFO">${json_str} = {
  "code": 0,
  "data": {
    "path": "/account/register",
    "host": "https://www.bitradex-test.com"
  },
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779979264179
}</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-28T22:41:04.201324" elapsed="0.000648"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.202332" level="INFO">{
  "code": 0,
  "data": {
    "path": "/account/register",
    "host": "https://www.bitradex-test.com"
  },
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779979264179
}</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-28T22:41:04.202118" elapsed="0.000338"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T22:41:04.200275" elapsed="0.002249"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:04.203198" 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-28T22:41:04.202648" elapsed="0.000573"/>
</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-28T22:41:04.203322" elapsed="0.000222"/>
</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-28T22:41:04.204572" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.205436" 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-28T22:41:04.205176" elapsed="0.000336"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T22:41:04.206065" 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-28T22:41:04.205748" elapsed="0.000356"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.206402" level="INFO">Length is 2.</msg>
<msg time="2026-05-28T22:41:04.206480" 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-28T22:41:04.206261" elapsed="0.000246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.206763" level="INFO">分享信息数据包含 2 个字段</msg>
<arg>分享信息数据包含 ${count} 个字段</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:04.206630" elapsed="0.000179"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:04.207492" 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-28T22:41:04.207185" elapsed="0.000443">Dictionary does not contain key 'title'.</status>
</kw>
<msg time="2026-05-28T22:41:04.207850" 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-28T22:41:04.206943" elapsed="0.000936"/>
</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-28T22:41:04.208092" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:04.208695" 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-28T22:41:04.208503" elapsed="0.000257">Dictionary does not contain key 'content'.</status>
</kw>
<msg time="2026-05-28T22:41:04.208841" 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-28T22:41:04.208385" elapsed="0.000475"/>
</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-28T22:41:04.208974" elapsed="0.000093"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:04.209684" 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-28T22:41:04.209535" elapsed="0.000209">Dictionary does not contain key 'url'.</status>
</kw>
<msg time="2026-05-28T22:41:04.209825" 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-28T22:41:04.209162" elapsed="0.000683"/>
</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-28T22:41:04.209950" elapsed="0.000092"/>
</kw>
<arg>${data}</arg>
<doc>验证应用分享信息的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:04.204071" elapsed="0.006046"/>
</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-28T22:41:04.203709" elapsed="0.006456"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.211525" 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-28T22:41:04.210802" elapsed="0.000770"/>
</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-28T22:41:04.211957" elapsed="0.000911"/>
</kw>
<msg time="2026-05-28T22:41:04.213586" 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-28T22:41:04.211779" elapsed="0.002109"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.215020" 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-28T22:41:04.214670" elapsed="0.000382"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.215510" 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-28T22:41:04.215223" elapsed="0.000314"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.215894" 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-28T22:41:04.215684" elapsed="0.000235"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.216811" 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-28T22:41:04.216038" elapsed="0.000820"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.217275" 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-28T22:41:04.217039" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.217543" 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-28T22:41:04.217410" elapsed="0.000171"/>
</kw>
<arg>获取应用分享信息</arg>
<arg>/v1/app/public/app/share/info</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T22:41:04.210429" elapsed="0.007227"/>
</kw>
<doc>验证应用分享信息接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T22:41:03.766048" elapsed="0.451804"/>
</test>
<doc>应用分享信息接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:03.747530" elapsed="0.470769"/>
</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-28T22:41:04.224521" 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-28T22:41:04.224318" elapsed="0.000237"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.225052" 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-28T22:41:04.224908" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:04.224665" elapsed="0.000469"/>
</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-28T22:41:04.225252" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:04.225159" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:04.224630" elapsed="0.000689"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.226193" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:04.226074" 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-28T22:41:04.226468" 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-28T22:41:04.226587" 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-28T22:41:04.226697" 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-28T22:41:04.226807" 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-28T22:41:04.226912" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:04.226300" elapsed="0.000658"/>
</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-28T22:41:04.227562" 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-28T22:41:04.227673" 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-28T22:41:04.227780" 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-28T22:41:04.227887" 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-28T22:41:04.227990" 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-28T22:41:04.228096" elapsed="0.000079"/>
</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-28T22:41:04.228268" 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-28T22:41:04.228372" 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-28T22:41:04.228475" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:04.226979" elapsed="0.001541"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.228839" 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-28T22:41:04.228626" elapsed="0.000254"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.229163" 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-28T22:41:04.228981" elapsed="0.000219"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.229550" 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-28T22:41:04.229302" elapsed="0.000303"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.229943" 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-28T22:41:04.229732" elapsed="0.000255"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.230297" 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-28T22:41:04.230097" elapsed="0.000240"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.230645" 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-28T22:41:04.230445" elapsed="0.000240"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.230992" 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-28T22:41:04.230791" elapsed="0.000240"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.231342" 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-28T22:41:04.231137" elapsed="0.000243"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.231687" 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-28T22:41:04.231484" elapsed="0.000242"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:04.228541" elapsed="0.003218"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:04.226282" elapsed="0.005497"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.232014" 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-28T22:41:04.231871" elapsed="0.000183"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:04.232379" 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-28T22:41:04.232143" elapsed="0.000383"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:04.225808" elapsed="0.006782"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.232763" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:04.232684" elapsed="0.000116"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:04.224026" elapsed="0.008819"/>
</kw>
<test id="s1-s1-s3-t1" name="获取应用版本信息" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.235161" 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-28T22:41:04.234594" elapsed="0.000593"/>
</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-28T22:41:04.235825" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:04.235295" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:04.235278" elapsed="0.000615"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:04.235932" elapsed="0.000053"/>
</return>
<msg time="2026-05-28T22:41:04.236175" 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-28T22:41:04.233911" elapsed="0.002342"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:04.665709" 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-28T22:41:04.665902" 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 14:41:04 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': 'b3c60d1be4d8694e9cc978c9ca6b7202', 'X-Transparent': '00-b3c60d1be4d8694e9cc978c9ca6b7202-3aff82709065afa3-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': 'a02e04a2ba5708d9-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":1779979264589} 
 </msg>
<msg time="2026-05-28T22:41:04.666009" 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-28T22:41:04.666319" 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-28T22:41:04.237019" elapsed="0.429375"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:04.666569" elapsed="0.000124"/>
</return>
<msg time="2026-05-28T22:41:04.667003" 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-28T22:41:04.236394" elapsed="0.430671"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.668926" 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-28T22:41:04.668211" elapsed="0.000823"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.669717" 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-28T22:41:04.669220" elapsed="0.000521"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.670684" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:04.669871" elapsed="0.000940"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:04.667548" elapsed="0.003412"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.672736" 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-28T22:41:04.671838" elapsed="0.000957"/>
</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-28T22:41:04.673016" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.673695" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:04.673532" elapsed="0.000213"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T22:41:04.671378" elapsed="0.002447"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.675128" 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-28T22:41:04.674430" elapsed="0.000736"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.675841" 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-28T22:41:04.675312" elapsed="0.000569"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.676356" 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": 1779979264589
}</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-28T22:41:04.676044" elapsed="0.000440"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T22:41:04.674057" elapsed="0.002603"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.678305" 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-28T22:41:04.677527" elapsed="0.000824"/>
</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-28T22:41:04.678959" elapsed="0.001020"/>
</kw>
<msg time="2026-05-28T22:41:04.680208" 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-28T22:41:04.678578" elapsed="0.001669"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.681278" 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-28T22:41:04.680663" elapsed="0.000706"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.682070" 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-28T22:41:04.681687" elapsed="0.000426"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.682630" 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-28T22:41:04.682356" elapsed="0.000308"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.683134" 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-28T22:41:04.682810" elapsed="0.000354"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.683471" 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-28T22:41:04.683282" elapsed="0.000218"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.683816" 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-28T22:41:04.683612" elapsed="0.000279"/>
</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-28T22:41:04.676937" elapsed="0.007085"/>
</kw>
<doc>验证应用版本信息接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T22:41:04.232899" elapsed="0.451314"/>
</test>
<doc>应用版本信息接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:04.219322" elapsed="0.465344"/>
</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-28T22:41:04.691404" 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-28T22:41:04.691084" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.692041" 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-28T22:41:04.691856" elapsed="0.000244"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:04.691586" 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-28T22:41:04.692305" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:04.692173" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:04.691554" elapsed="0.000834"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.693234" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:04.693086" elapsed="0.000203"/>
</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-28T22:41:04.693553" 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-28T22:41:04.693692" 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-28T22:41:04.693819" 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-28T22:41:04.693947" 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-28T22:41:04.694073" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:04.693366" elapsed="0.000757"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:04.694332" elapsed="0.000127"/>
</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-28T22:41:04.694579" 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-28T22:41:04.694707" 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-28T22:41:04.694824" 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-28T22:41:04.694927" 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-28T22:41:04.695028" 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-28T22:41:04.695130" 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-28T22:41:04.695231" 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-28T22:41:04.695332" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:04.694150" elapsed="0.001226"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.695689" 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-28T22:41:04.695481" elapsed="0.000250"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.696019" 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-28T22:41:04.695833" elapsed="0.000223"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.696339" 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-28T22:41:04.696157" elapsed="0.000219"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.696664" 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-28T22:41:04.696478" elapsed="0.000222"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.696978" 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-28T22:41:04.696799" elapsed="0.000217"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.697298" 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-28T22:41:04.697115" elapsed="0.000220"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.697631" 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-28T22:41:04.697433" elapsed="0.000235"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.697964" 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-28T22:41:04.697768" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.698293" 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-28T22:41:04.698101" elapsed="0.000229"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:04.695396" elapsed="0.002967"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:04.693346" elapsed="0.005036"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.698619" 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-28T22:41:04.698470" elapsed="0.000191"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:04.699058" 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-28T22:41:04.698762" elapsed="0.000490"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:04.692754" elapsed="0.006568"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.699507" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:04.699422" elapsed="0.000125"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:04.690640" elapsed="0.008956"/>
</kw>
<test id="s1-s1-s4-t1" name="获取Banner列表" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.700677" 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-28T22:41:04.700478" elapsed="0.000225"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:04.702319" 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-28T22:41:04.701702" elapsed="0.000645"/>
</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-28T22:41:04.702956" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:04.702490" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:04.702473" elapsed="0.000551"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:04.703051" elapsed="0.000030"/>
</return>
<msg time="2026-05-28T22:41:04.703220" 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-28T22:41:04.700893" elapsed="0.002349"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:05.037423" 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-28T22:41:05.037613" 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 14:41:05 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': '227c9adfdf1621da7f5c2acddef833c7', 'X-Transparent': '00-227c9adfdf1621da7f5c2acddef833c7-1573615c2288fa45-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.012', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02e04a5bc649fe0-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":[],"msg":"Success.","msgInfo":{"template":"Success."},"ts":1779979265027} 
 </msg>
<msg time="2026-05-28T22:41:05.037695" 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-28T22:41:05.037892" 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-28T22:41:04.703339" elapsed="0.334599"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.039555" 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-28T22:41:05.038303" elapsed="0.001360"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.040974" level="INFO">${resp_json} = {'code': 0, 'data': [], 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1779979265027}</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-28T22:41:05.040050" elapsed="0.000964"/>
</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-28T22:41:05.041183" elapsed="0.000240"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.042409" level="INFO">${json_str} = {
  "code": 0,
  "data": [],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779979265027
}</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-28T22:41:05.041621" elapsed="0.000832"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.042851" level="INFO">{
  "code": 0,
  "data": [],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779979265027
}</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-28T22:41:05.042620" elapsed="0.000354"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:05.043820" 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-28T22:41:05.043127" elapsed="0.000728"/>
</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-28T22:41:05.044004" elapsed="0.000310"/>
</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-28T22:41:05.045270" elapsed="0.000220"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.045725" level="INFO">Length is 0.</msg>
<msg time="2026-05-28T22:41:05.045800" 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-28T22:41:05.045608" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.046181" 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-28T22:41:05.046020" elapsed="0.000209"/>
</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-28T22:41:05.046432" elapsed="0.000820"/>
</kw>
<arg>${data}</arg>
<doc>验证Banner列表的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:05.044901" elapsed="0.002614"/>
</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-28T22:41:05.044475" elapsed="0.003141"/>
</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-28T22:41:05.047777" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.048831" 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-28T22:41:05.048242" elapsed="0.000645"/>
</kw>
<doc>验证Banner列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T22:41:04.699674" elapsed="0.349329"/>
</test>
<doc>Banner列表接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:04.685718" elapsed="0.363564"/>
</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-28T22:41:05.054473" 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-28T22:41:05.054298" elapsed="0.000203"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.054963" 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-28T22:41:05.054753" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:05.054581" elapsed="0.000552"/>
</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-28T22:41:05.055338" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:05.055165" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:05.054560" elapsed="0.000868"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.056209" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:05.056050" elapsed="0.000216"/>
</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-28T22:41:05.056468" 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-28T22:41:05.056561" 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-28T22:41:05.056644" 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-28T22:41:05.056724" elapsed="0.000012"/>
</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-28T22:41:05.056806" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:05.056328" elapsed="0.000514"/>
</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-28T22:41:05.056976" 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-28T22:41:05.057063" 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-28T22:41:05.057150" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:05.057233" 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-28T22:41:05.057315" elapsed="0.000013"/>
</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-28T22:41:05.057398" elapsed="0.000012"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:05.057479" 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-28T22:41:05.057561" elapsed="0.000011"/>
</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-28T22:41:05.057641" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:05.056859" elapsed="0.000815"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.057926" 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-28T22:41:05.057757" elapsed="0.000201"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.058180" 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-28T22:41:05.058035" elapsed="0.000175"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.058486" 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-28T22:41:05.058342" elapsed="0.000175"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.058743" 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-28T22:41:05.058595" elapsed="0.000178"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.058996" 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-28T22:41:05.058850" elapsed="0.000177"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.059251" 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-28T22:41:05.059105" elapsed="0.000176"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.059513" 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-28T22:41:05.059358" elapsed="0.000185"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.059770" 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-28T22:41:05.059621" elapsed="0.000179"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.060031" 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-28T22:41:05.059878" elapsed="0.000182"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:05.057690" elapsed="0.002396"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:05.056313" elapsed="0.003788"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.060299" 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-28T22:41:05.060179" elapsed="0.000154"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:05.060655" 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-28T22:41:05.060414" elapsed="0.000410"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:05.055718" elapsed="0.005164"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.061031" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:05.060962" elapsed="0.000102"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:05.053805" elapsed="0.007300"/>
</kw>
<test id="s1-s1-s5-t1" name="申请验证码" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.062034" 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-28T22:41:05.061870" elapsed="0.000185"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.063935" 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-28T22:41:05.062887" elapsed="0.001083"/>
</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-28T22:41:05.064687" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:05.064158" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:05.064138" elapsed="0.000619"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:05.064783" elapsed="0.000027"/>
</return>
<msg time="2026-05-28T22:41:05.064946" 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-28T22:41:05.062213" elapsed="0.002751"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:05.814199" 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-28T22:41:05.814546" 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 14:41:05 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': 'aefe5d5b3996a6256860420749dd200b', 'X-Transparent': '00-aefe5d5b3996a6256860420749dd200b-f4f371667e0bc35b-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.009', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02e04a86c0f04fd-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":{"code":"","sdkKey":"a78c3a7d6d0e43c75bac3e0ca5effbed","enabled":true},"msg":"Success.","msgInfo":{"template":"Success."},"ts":1779979265455} 
 </msg>
<msg time="2026-05-28T22:41:05.814787" 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-28T22:41:05.815086" 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-28T22:41:05.065387" elapsed="0.749760"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:05.815330" elapsed="0.000101"/>
</return>
<msg time="2026-05-28T22:41:05.815780" 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-28T22:41:05.065087" elapsed="0.750756"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.817466" 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-28T22:41:05.816674" elapsed="0.000887"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.818387" 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-28T22:41:05.817761" elapsed="0.000661"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.818732" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:05.818580" elapsed="0.000195"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:05.816144" elapsed="0.002703"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.820003" level="INFO">${json_data} = {'code': 0, 'data': {'code': '', 'sdkKey': 'a78c3a7d6d0e43c75bac3e0ca5effbed', 'enabled': True}, 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1779979265455}</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-28T22:41:05.819403" elapsed="0.000647"/>
</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-28T22:41:05.820225" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.820917" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:05.820704" elapsed="0.000288"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T22:41:05.819088" elapsed="0.002004"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.822269" level="INFO">${json_data} = {'code': 0, 'data': {'code': '', 'sdkKey': 'a78c3a7d6d0e43c75bac3e0ca5effbed', 'enabled': True}, 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1779979265455}</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-28T22:41:05.821767" elapsed="0.000527"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.822976" 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-28T22:41:05.822401" elapsed="0.000619"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.823359" level="INFO">{
  "code": 0,
  "data": {
    "code": "",
    "sdkKey": "a78c3a7d6d0e43c75bac3e0ca5effbed",
    "enabled": true
  },
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1779979265455
}</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-28T22:41:05.823162" elapsed="0.000338"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T22:41:05.821366" elapsed="0.002208"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.824871" 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-28T22:41:05.824222" elapsed="0.000701"/>
</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-28T22:41:05.825377" elapsed="0.000845"/>
</kw>
<msg time="2026-05-28T22:41:05.826380" 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-28T22:41:05.825103" elapsed="0.001315"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.826803" 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-28T22:41:05.826610" elapsed="0.000223"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.827188" 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-28T22:41:05.826963" elapsed="0.000252"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.827613" 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-28T22:41:05.827446" elapsed="0.000189"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.828012" 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-28T22:41:05.827758" elapsed="0.000281"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.828310" 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-28T22:41:05.828136" elapsed="0.000196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.828549" 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-28T22:41:05.828429" elapsed="0.000161"/>
</kw>
<arg>请求验证码</arg>
<arg>/v1/app/public/captcha/apply</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T22:41:05.823813" elapsed="0.004843"/>
</kw>
<doc>验证验证码请求接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T22:41:05.061159" elapsed="0.767667"/>
</test>
<doc>验证码申请接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:05.050057" elapsed="0.779385"/>
</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-28T22:41:05.835954" 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-28T22:41:05.835658" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.836482" 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-28T22:41:05.836354" elapsed="0.000178"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:05.836151" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:05.836668" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:05.836587" elapsed="0.000123"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:05.836115" elapsed="0.000613"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.837347" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:05.837240" elapsed="0.000146"/>
</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-28T22:41:05.837585" 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-28T22:41:05.837687" 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-28T22:41:05.837783" 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-28T22:41:05.837878" 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-28T22:41:05.837973" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:05.837443" elapsed="0.000574"/>
</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-28T22:41:05.838159" 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-28T22:41:05.838260" 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-28T22:41:05.838357" 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-28T22:41:05.838456" 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-28T22:41:05.838762" elapsed="0.000047"/>
</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-28T22:41:05.838961" elapsed="0.000025"/>
</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-28T22:41:05.839105" elapsed="0.000021"/>
</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-28T22:41:05.839233" 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-28T22:41:05.839465" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:05.838037" elapsed="0.001488"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.840037" 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-28T22:41:05.839682" elapsed="0.000416"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.840469" 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-28T22:41:05.840228" elapsed="0.000292"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.840868" 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-28T22:41:05.840645" elapsed="0.000271"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.841256" 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-28T22:41:05.841037" elapsed="0.000263"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.841660" 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-28T22:41:05.841421" elapsed="0.000284"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.842050" 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-28T22:41:05.841826" elapsed="0.000268"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.842442" 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-28T22:41:05.842214" elapsed="0.000267"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.842780" 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-28T22:41:05.842586" elapsed="0.000231"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.843112" 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-28T22:41:05.842916" elapsed="0.000233"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:05.839562" elapsed="0.003620"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:05.837427" elapsed="0.005776"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.843480" 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-28T22:41:05.843301" elapsed="0.000226"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:05.843928" 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-28T22:41:05.843627" elapsed="0.000495"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:05.836991" elapsed="0.007207"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.844396" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:05.844301" elapsed="0.000150"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:05.835271" elapsed="0.009235"/>
</kw>
<test id="s1-s1-s6-t1" name="获取开屏广告列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:05.848374" 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-28T22:41:05.847446" elapsed="0.000968"/>
</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-28T22:41:05.849168" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:05.848559" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:05.848535" elapsed="0.000725"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:05.849299" elapsed="0.000040"/>
</return>
<msg time="2026-05-28T22:41:05.849525" 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-28T22:41:05.845864" elapsed="0.003690"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:06.240274" 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-28T22:41:06.240742" 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 14:41:06 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': '3866f1f1348190914aa018a93a7ecb36', 'X-Transparent': '00-3866f1f1348190914aa018a93a7ecb36-0994a8f02cd94dc1-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': 'a02e04aced6b8512-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":1779979266179} 
 </msg>
<msg time="2026-05-28T22:41:06.241128" 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-28T22:41:06.241359" 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-28T22:41:05.850448" elapsed="0.390943"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:06.241502" elapsed="0.000081"/>
</return>
<msg time="2026-05-28T22:41:06.241843" 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-28T22:41:05.849732" elapsed="0.392137"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.243701" 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-28T22:41:06.242862" elapsed="0.000959"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.244660" 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-28T22:41:06.244025" elapsed="0.000669"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.245071" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:06.244894" elapsed="0.000229"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:06.242291" elapsed="0.002947"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.248507" 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-28T22:41:06.246448" elapsed="0.002157"/>
</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-28T22:41:06.248964" elapsed="0.000435"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.249852" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:06.249622" elapsed="0.000324"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T22:41:06.245685" elapsed="0.004379"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.251463" 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-28T22:41:06.250729" elapsed="0.000768"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.252411" 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-28T22:41:06.251636" elapsed="0.000814"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.252849" 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": 1779979266179
}</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-28T22:41:06.252613" elapsed="0.000579"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T22:41:06.250373" elapsed="0.002913"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.254584" 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-28T22:41:06.253950" elapsed="0.000675"/>
</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-28T22:41:06.255644" elapsed="0.001039"/>
</kw>
<msg time="2026-05-28T22:41:06.256851" 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-28T22:41:06.254868" elapsed="0.002018"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.257518" 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-28T22:41:06.257151" elapsed="0.000409"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.258195" 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-28T22:41:06.257782" elapsed="0.000466"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.258605" 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-28T22:41:06.258412" elapsed="0.000222"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.259106" 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-28T22:41:06.258766" elapsed="0.000372"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.259472" 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-28T22:41:06.259262" elapsed="0.000239"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.259782" 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-28T22:41:06.259627" elapsed="0.000203"/>
</kw>
<arg>获取开屏广告列表</arg>
<arg>/v1/app/public/open-screen/list</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T22:41:06.253554" elapsed="0.006365"/>
</kw>
<doc>验证开屏广告列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T22:41:05.844593" elapsed="0.415558"/>
</test>
<doc>开屏广告列表接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:05.830576" elapsed="0.430031"/>
</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-28T22:41:06.267487" 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-28T22:41:06.267246" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.268314" 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-28T22:41:06.268022" elapsed="0.000372"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:06.267654" elapsed="0.000799"/>
</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-28T22:41:06.268639" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:06.268492" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:06.267620" elapsed="0.001105"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.269578" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:06.269423" 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-28T22:41:06.269956" elapsed="0.000028"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:06.270109" elapsed="0.000022"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:06.270241" 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-28T22:41:06.270367" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:06.270489" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:06.269718" elapsed="0.000824"/>
</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-28T22:41:06.272313" 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-28T22:41:06.272513" elapsed="0.000023"/>
</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-28T22:41:06.272633" 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-28T22:41:06.272740" 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-28T22:41:06.272843" 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-28T22:41:06.272946" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:06.273048" 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-28T22:41:06.273150" 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-28T22:41:06.273251" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:06.272112" elapsed="0.001184"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.273654" 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-28T22:41:06.273404" elapsed="0.000295"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.273990" 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-28T22:41:06.273799" elapsed="0.000230"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.274307" 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-28T22:41:06.274133" elapsed="0.000209"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.274618" 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-28T22:41:06.274437" elapsed="0.000218"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.274932" 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-28T22:41:06.274752" elapsed="0.000216"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.275247" 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-28T22:41:06.275062" elapsed="0.000222"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.275568" 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-28T22:41:06.275379" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.275897" 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-28T22:41:06.275711" elapsed="0.000227"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.276230" 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-28T22:41:06.276036" elapsed="0.000230"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:06.273318" elapsed="0.002981"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:06.269695" elapsed="0.006624"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.276576" 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-28T22:41:06.276412" elapsed="0.000208"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:06.277040" 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-28T22:41:06.276717" elapsed="0.000542"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:06.269079" elapsed="0.008256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.277521" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:06.277437" elapsed="0.000124"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:06.266864" elapsed="0.010747"/>
</kw>
<test id="s1-s1-s7-t1" name="获取开屏广告语言列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.280479" 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-28T22:41:06.279901" elapsed="0.000608"/>
</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-28T22:41:06.281103" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:06.280650" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:06.280632" elapsed="0.000545"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:06.281207" elapsed="0.000032"/>
</return>
<msg time="2026-05-28T22:41:06.281384" 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-28T22:41:06.279122" elapsed="0.002285"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:06.604929" 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-28T22:41:06.605491" 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 14:41:06 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': 'a0e7a3438ac00be4b316b7d620ec088d', 'X-Transparent': '00-a0e7a3438ac00be4b316b7d620ec088d-1fb1fd6d4720c43a-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': 'a02e04afdce21057-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":1779979266588} 
 </msg>
<msg time="2026-05-28T22:41:06.605789" 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-28T22:41:06.606276" 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-28T22:41:06.282117" elapsed="0.324264"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:06.606597" elapsed="0.000149"/>
</return>
<msg time="2026-05-28T22:41:06.607223" 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-28T22:41:06.281534" elapsed="0.325761"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.610476" 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-28T22:41:06.609005" elapsed="0.001769"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.612683" 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-28T22:41:06.611356" elapsed="0.001373"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.613293" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:06.612949" elapsed="0.000435"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:06.607968" elapsed="0.005534"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.615591" 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-28T22:41:06.614429" elapsed="0.001227"/>
</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-28T22:41:06.616021" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.616647" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:06.616504" elapsed="0.000187"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T22:41:06.613800" elapsed="0.002969"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.618307" 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-28T22:41:06.617457" elapsed="0.000912"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.619879" 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-28T22:41:06.618625" elapsed="0.001368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.620598" 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": 1779979266588
}</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-28T22:41:06.620258" elapsed="0.000494"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T22:41:06.617021" elapsed="0.003836"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:06.622349" 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-28T22:41:06.621041" elapsed="0.001495"/>
</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-28T22:41:06.623071" elapsed="0.000927"/>
</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-28T22:41:06.625789" elapsed="0.000492"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.626777" level="INFO">Length is 3.</msg>
<msg time="2026-05-28T22:41:06.626902" 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-28T22:41:06.626534" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.627370" level="INFO">语言列表包含 3 个语言项</msg>
<arg>语言列表包含 ${length} 个语言项</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:06.627119" elapsed="0.000312"/>
</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-28T22:41:06.630404" elapsed="0.000682"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.631593" 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-28T22:41:06.631339" elapsed="0.000314"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:06.632451" 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-28T22:41:06.632072" elapsed="0.001117">Dictionary does not contain key 'code'.</status>
</kw>
<msg time="2026-05-28T22:41:06.633374" 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-28T22:41:06.631778" elapsed="0.001634"/>
</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-28T22:41:06.633603" elapsed="0.000185"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:06.634344" 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-28T22:41:06.634110" elapsed="0.000310">Dictionary does not contain key 'name'.</status>
</kw>
<msg time="2026-05-28T22:41:06.634527" 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-28T22:41:06.633942" elapsed="0.000613"/>
</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-28T22:41:06.634692" elapsed="0.000129"/>
</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-28T22:41:06.635103" elapsed="0.000165"/>
</kw>
<msg time="2026-05-28T22:41:06.635364" 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-28T22:41:06.634952" elapsed="0.000438"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.636361" 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-28T22:41:06.635711" elapsed="0.000707"/>
</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-28T22:41:06.635520" elapsed="0.000954"/>
</kw>
<arg>${lang_list[0]}</arg>
<doc>验证单个语言项的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:06.628559" elapsed="0.007998"/>
</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-28T22:41:06.627630" elapsed="0.008979"/>
</kw>
<arg>${data}</arg>
<doc>验证语言列表的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:06.625113" elapsed="0.011559"/>
</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-28T22:41:06.624384" elapsed="0.012337"/>
</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-28T22:41:06.636886" elapsed="0.000288"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.638517" 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-28T22:41:06.637959" elapsed="0.000592"/>
</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-28T22:41:06.638858" elapsed="0.000550"/>
</kw>
<msg time="2026-05-28T22:41:06.639509" 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-28T22:41:06.638689" elapsed="0.000849"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.639842" 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-28T22:41:06.639676" elapsed="0.000190"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.640178" 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-28T22:41:06.639981" elapsed="0.000221"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.640670" 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-28T22:41:06.640312" elapsed="0.000387"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.641081" 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-28T22:41:06.640813" elapsed="0.000296"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.641416" 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-28T22:41:06.641219" elapsed="0.000225"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.641698" 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-28T22:41:06.641565" elapsed="0.000216"/>
</kw>
<arg>获取开屏广告语言列表</arg>
<arg>/v1/app/public/open-screen/list/lang</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T22:41:06.637489" elapsed="0.004346"/>
</kw>
<doc>验证开屏广告语言列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T22:41:06.277692" elapsed="0.364273"/>
</test>
<doc>开屏广告语言列表接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:06.261664" elapsed="0.380595"/>
</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-28T22:41:06.647256" 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-28T22:41:06.647056" elapsed="0.000231"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.647722" 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-28T22:41:06.647590" elapsed="0.000175"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:06.647387" elapsed="0.000408"/>
</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-28T22:41:06.647899" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:06.647819" elapsed="0.000120"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:06.647357" elapsed="0.000599"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.648489" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:06.648388" elapsed="0.000138"/>
</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-28T22:41:06.648704" 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-28T22:41:06.648801" 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-28T22:41:06.648890" 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-28T22:41:06.648978" 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-28T22:41:06.649068" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:06.648578" elapsed="0.000528"/>
</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-28T22:41:06.649244" 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-28T22:41:06.649338" 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-28T22:41:06.649429" 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-28T22:41:06.649517" 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-28T22:41:06.649602" 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-28T22:41:06.649688" 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-28T22:41:06.649773" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:06.649857" 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-28T22:41:06.649942" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:06.649123" elapsed="0.000858"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.650356" 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-28T22:41:06.650070" elapsed="0.000322"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.650638" 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-28T22:41:06.650480" elapsed="0.000190"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.650915" 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-28T22:41:06.650757" elapsed="0.000189"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.651187" 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-28T22:41:06.651030" elapsed="0.000189"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.651462" 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-28T22:41:06.651303" elapsed="0.000223"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.651777" 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-28T22:41:06.651611" elapsed="0.000197"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.652063" 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-28T22:41:06.651893" elapsed="0.000202"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.652358" 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-28T22:41:06.652180" elapsed="0.000210"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.652640" 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-28T22:41:06.652476" elapsed="0.000195"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:06.649999" elapsed="0.002700"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:06.648565" elapsed="0.004150"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.653000" 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-28T22:41:06.652789" elapsed="0.000267"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:06.653509" 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-28T22:41:06.653184" elapsed="0.000544"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:06.648181" elapsed="0.005613"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.653982" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:06.653894" elapsed="0.000127"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:06.646824" elapsed="0.007245"/>
</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-28T22:41:06.656149" 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-28T22:41:06.655626" elapsed="0.000549"/>
</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-28T22:41:06.656687" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:06.656273" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:06.656258" elapsed="0.000500"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:06.656787" elapsed="0.000035"/>
</return>
<msg time="2026-05-28T22:41:06.656993" 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-28T22:41:06.654925" elapsed="0.002090"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.657248" 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-28T22:41:06.657106" elapsed="0.000163"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:06.976290" 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-28T22:41:06.976571" 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 14:41:06 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': '2dca4ad723326a417f242ffccff1bec1', 'X-Transparent': '00-2dca4ad723326a417f242ffccff1bec1-95ac1df748f11ede-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.011', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02e04b238abe2fd-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":1779979266963} 
 </msg>
<msg time="2026-05-28T22:41:06.976957" 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-28T22:41:06.977378" 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-28T22:41:06.657715" elapsed="0.319745"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:06.977613" elapsed="0.000083"/>
</return>
<msg time="2026-05-28T22:41:06.978016" 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-28T22:41:06.657383" elapsed="0.320673"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.980375" 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-28T22:41:06.979104" elapsed="0.001608"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.981850" 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-28T22:41:06.981083" elapsed="0.000814"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.982295" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:06.982078" elapsed="0.000260"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:06.978521" elapsed="0.003898"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.984379" 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-28T22:41:06.983304" elapsed="0.001107"/>
</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-28T22:41:06.984559" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.985246" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:06.985039" elapsed="0.000277"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T22:41:06.982744" elapsed="0.002671"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.987806" 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-28T22:41:06.986048" elapsed="0.001857"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.990083" 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-28T22:41:06.988256" elapsed="0.001930"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.990990" 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": 1779979266963
}</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-28T22:41:06.990575" elapsed="0.000898"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T22:41:06.985707" elapsed="0.005879"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.993421" 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-28T22:41:06.992723" elapsed="0.000745"/>
</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-28T22:41:06.993826" elapsed="0.001073"/>
</kw>
<msg time="2026-05-28T22:41:06.995102" 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-28T22:41:06.993659" elapsed="0.001477"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.996675" 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-28T22:41:06.995492" elapsed="0.001319"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.997774" 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-28T22:41:06.997206" elapsed="0.000621"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.998522" 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-28T22:41:06.998089" elapsed="0.000479"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.999094" 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-28T22:41:06.998775" elapsed="0.000348"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.999456" 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-28T22:41:06.999236" elapsed="0.000245"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:06.999704" 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-28T22:41:06.999581" elapsed="0.000162"/>
</kw>
<arg>获取Vajra District列表</arg>
<arg>/v1/app/public/vajra-district/list</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T22:41:06.991933" elapsed="0.007881"/>
</kw>
<doc>验证Vajra District列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-05-28T22:41:06.654125" elapsed="0.345828"/>
</test>
<doc>Vajra District 接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:06.643242" elapsed="0.357032"/>
</suite>
<status status="PASS" start="2026-05-28T22:41:02.800468" elapsed="4.200582"/>
</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-28T22:41:07.006926" 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-28T22:41:07.006782" elapsed="0.000169"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.007266" 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-28T22:41:07.007168" elapsed="0.000130"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:07.007017" elapsed="0.000307"/>
</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-28T22:41:07.007407" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:07.007342" elapsed="0.000100"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:07.006998" elapsed="0.000456"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.007904" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:07.007819" elapsed="0.000116"/>
</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-28T22:41:07.008092" 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-28T22:41:07.008176" 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-28T22:41:07.008252" elapsed="0.000012"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:07.008329" elapsed="0.000012"/>
</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-28T22:41:07.008403" elapsed="0.000011"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:07.007980" elapsed="0.000488"/>
</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-28T22:41:07.008592" 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-28T22:41:07.008670" 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-28T22:41:07.008747" elapsed="0.000012"/>
</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-28T22:41:07.008821" 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-28T22:41:07.008896" 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-28T22:41:07.008969" elapsed="0.000011"/>
</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-28T22:41:07.009042" 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-28T22:41:07.009116" elapsed="0.000011"/>
</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-28T22:41:07.009188" elapsed="0.000011"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:07.008484" elapsed="0.000736"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.009442" 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-28T22:41:07.009293" elapsed="0.000179"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.009675" 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-28T22:41:07.009542" elapsed="0.000160"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.009907" 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-28T22:41:07.009773" elapsed="0.000160"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.010138" 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-28T22:41:07.010003" elapsed="0.000161"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.010368" 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-28T22:41:07.010233" elapsed="0.000161"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.010605" 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-28T22:41:07.010463" elapsed="0.000169"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.010847" 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-28T22:41:07.010702" elapsed="0.000171"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.011085" 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-28T22:41:07.010942" elapsed="0.000170"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.011331" 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-28T22:41:07.011184" elapsed="0.000174"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:07.009234" elapsed="0.002147"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:07.007969" elapsed="0.003426"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.011663" 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-28T22:41:07.011505" elapsed="0.000199"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:07.012103" 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-28T22:41:07.011800" elapsed="0.000562"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:07.007645" elapsed="0.004782"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.012593" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:07.012514" elapsed="0.000111"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:07.006593" elapsed="0.006071"/>
</kw>
<test id="s1-s2-s1-s1-t1" name="获取期货U本位交易对详情" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.013843" 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-28T22:41:07.013695" elapsed="0.000168"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.014985" 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-28T22:41:07.014549" elapsed="0.000479"/>
</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-28T22:41:07.015485" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:07.015118" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:07.015102" elapsed="0.000448"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:07.015574" elapsed="0.000032"/>
</return>
<msg time="2026-05-28T22:41:07.015722" 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-28T22:41:07.014012" elapsed="0.001728"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:07.419487" 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-28T22:41:07.419685" 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 14:41:07 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': '85893f84640b34a89ef549ed7d1d0af3', 'X-Transparent': '00-85893f84640b34a89ef549ed7d1d0af3-55eef8618501f171-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.022', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02e04b4ea6c050b-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":1779979267408} 
 </msg>
<msg time="2026-05-28T22:41:07.419770" 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-28T22:41:07.419959" 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-28T22:41:07.016121" elapsed="0.403870"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:07.420095" elapsed="0.000061"/>
</return>
<msg time="2026-05-28T22:41:07.420398" 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-28T22:41:07.015841" elapsed="0.404600"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.421760" 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-28T22:41:07.421239" elapsed="0.000589"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.422412" 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-28T22:41:07.421953" elapsed="0.000487"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.422687" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:07.422552" elapsed="0.000184"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:07.420806" elapsed="0.001986"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.423849" 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-28T22:41:07.423244" elapsed="0.000635"/>
</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-28T22:41:07.423986" elapsed="0.000180"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.424397" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:07.424273" elapsed="0.000167"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T22:41:07.422948" elapsed="0.001546"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.425399" 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-28T22:41:07.424899" elapsed="0.000528"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.425993" 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-28T22:41:07.425545" elapsed="0.000476"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.426291" 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": 1779979267408
}</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-28T22:41:07.426129" elapsed="0.000249"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T22:41:07.424633" elapsed="0.001800"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:07.427056" 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-28T22:41:07.426539" elapsed="0.000546"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.427348" 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-28T22:41:07.427196" elapsed="0.000196"/>
</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-28T22:41:07.427485" elapsed="0.000200"/>
</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-28T22:41:07.427796" elapsed="0.000140"/>
</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-28T22:41:07.428565" elapsed="0.000178"/>
</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-28T22:41:07.428833" elapsed="0.000139"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:07.429201" 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-28T22:41:07.429066" elapsed="0.000156"/>
</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-28T22:41:07.429559" elapsed="0.000122"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.430047" 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-28T22:41:07.429767" elapsed="0.000318"/>
</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-28T22:41:07.430175" elapsed="0.000265"/>
</kw>
<arg>${symbol}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:07.429337" elapsed="0.001159"/>
</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-28T22:41:07.430624" elapsed="0.000137"/>
</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-28T22:41:07.430857" elapsed="0.000124"/>
</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-28T22:41:07.431074" elapsed="0.000117"/>
</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-28T22:41:07.431285" elapsed="0.000117"/>
</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-28T22:41:07.431496" elapsed="0.000115"/>
</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-28T22:41:07.431707" elapsed="0.000111"/>
</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-28T22:41:07.431914" elapsed="0.000117"/>
</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-28T22:41:07.432129" elapsed="0.000112"/>
</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-28T22:41:07.432336" elapsed="0.000117"/>
</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-28T22:41:07.432546" elapsed="0.000113"/>
</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-28T22:41:07.432754" elapsed="0.000112"/>
</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-28T22:41:07.432958" elapsed="0.000117"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.433280" level="INFO">✅ 期货交易对详情项验证通过: btc_usdt</msg>
<arg>✅ 期货交易对详情项验证通过: ${symbol}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:07.433165" elapsed="0.000153"/>
</kw>
<arg>${data}</arg>
<doc>验证单个期货交易对详情项的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:07.428332" elapsed="0.005031"/>
</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-28T22:41:07.428036" elapsed="0.005365"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.434212" 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-28T22:41:07.433793" elapsed="0.000441"/>
</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-28T22:41:07.434445" elapsed="0.000391"/>
</kw>
<msg time="2026-05-28T22:41:07.434907" 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-28T22:41:07.434328" elapsed="0.000600"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.435125" 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-28T22:41:07.435020" elapsed="0.000124"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.435380" 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-28T22:41:07.435229" elapsed="0.000170"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.435619" 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-28T22:41:07.435484" elapsed="0.000161"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.435938" 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-28T22:41:07.435727" elapsed="0.000234"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.436194" 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-28T22:41:07.436044" elapsed="0.000170"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.436413" 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-28T22:41:07.436321" elapsed="0.000125"/>
</kw>
<arg>获取期货U本位交易对详情</arg>
<arg>/v1/future-u/market/public/symbol/detail</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T22:41:07.433541" elapsed="0.002944"/>
</kw>
<doc>验证期货U本位交易对详情接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:07.012716" elapsed="0.423874"/>
</test>
<test id="s1-s2-s1-s1-t2" name="获取期货U本位其他交易对详情" line="35">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.437966" 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-28T22:41:07.437805" elapsed="0.000182"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.439148" 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-28T22:41:07.438671" elapsed="0.000499"/>
</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-28T22:41:07.439646" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:07.439270" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:07.439252" elapsed="0.000457"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:07.439734" elapsed="0.000025"/>
</return>
<msg time="2026-05-28T22:41:07.439885" 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-28T22:41:07.438140" elapsed="0.001765"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:07.623613" 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-28T22:41:07.623874" 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 14:41:07 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': '8cccf44e09377f84fc94a74c08db2d71', 'X-Transparent': '00-8cccf44e09377f84fc94a74c08db2d71-d25f52a5d1d47fbc-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': 'a02e04b5db0b050b-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":1779979267612} 
 </msg>
<msg time="2026-05-28T22:41:07.623985" 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-28T22:41:07.624262" 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-28T22:41:07.440322" elapsed="0.183972"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:07.624438" elapsed="0.000121"/>
</return>
<msg time="2026-05-28T22:41:07.624832" 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-28T22:41:07.440009" elapsed="0.184844"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.627096" 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-28T22:41:07.625982" elapsed="0.001303"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.628121" 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-28T22:41:07.627549" elapsed="0.000598"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.628465" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:07.628274" elapsed="0.000292"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:07.625213" elapsed="0.003502"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.631633" 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-28T22:41:07.629656" elapsed="0.002049"/>
</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-28T22:41:07.631970" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.632629" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:07.632448" elapsed="0.000227"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T22:41:07.629083" elapsed="0.003672"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.634513" 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-28T22:41:07.633845" elapsed="0.000706"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.635286" 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-28T22:41:07.634704" elapsed="0.000618"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.635674" 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": 1779979267612
}</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-28T22:41:07.635463" elapsed="0.000356"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T22:41:07.633005" elapsed="0.002882"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:07.636700" 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-28T22:41:07.635995" elapsed="0.000740"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.637096" 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-28T22:41:07.636906" elapsed="0.000246"/>
</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-28T22:41:07.637278" elapsed="0.000411"/>
</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-28T22:41:07.637971" elapsed="0.000317"/>
</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-28T22:41:07.640014" elapsed="0.000456"/>
</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-28T22:41:07.640790" elapsed="0.000352"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:07.641493" 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-28T22:41:07.641292" elapsed="0.000233"/>
</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-28T22:41:07.642141" elapsed="0.000216"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.642627" 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-28T22:41:07.642472" elapsed="0.000198"/>
</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-28T22:41:07.642775" elapsed="0.000155"/>
</kw>
<arg>${symbol}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:07.641779" elapsed="0.001220"/>
</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-28T22:41:07.643120" elapsed="0.000250"/>
</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-28T22:41:07.643511" elapsed="0.000158"/>
</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-28T22:41:07.643775" elapsed="0.000141"/>
</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-28T22:41:07.644028" elapsed="0.000148"/>
</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-28T22:41:07.644289" elapsed="0.000161"/>
</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-28T22:41:07.644587" elapsed="0.000156"/>
</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-28T22:41:07.644916" elapsed="0.000137"/>
</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-28T22:41:07.645160" elapsed="0.000121"/>
</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-28T22:41:07.645376" elapsed="0.000111"/>
</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-28T22:41:07.645629" elapsed="0.000382"/>
</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-28T22:41:07.646362" elapsed="0.000418"/>
</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-28T22:41:07.646976" elapsed="0.000191"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.647464" level="INFO">✅ 期货交易对详情项验证通过: eth_usdt</msg>
<arg>✅ 期货交易对详情项验证通过: ${symbol}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:07.647274" elapsed="0.000245"/>
</kw>
<arg>${data}</arg>
<doc>验证单个期货交易对详情项的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:07.639465" elapsed="0.008134"/>
</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-28T22:41:07.638572" elapsed="0.009075"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.648913" 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-28T22:41:07.648365" elapsed="0.000583"/>
</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-28T22:41:07.649225" elapsed="0.000510"/>
</kw>
<msg time="2026-05-28T22:41:07.649826" 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-28T22:41:07.649085" elapsed="0.000764"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.650130" 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-28T22:41:07.649996" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.650437" 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-28T22:41:07.650248" elapsed="0.000209"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.650822" 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-28T22:41:07.650676" elapsed="0.000167"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.651174" 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-28T22:41:07.650938" elapsed="0.000261"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.651598" 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-28T22:41:07.651293" elapsed="0.000349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.651939" 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-28T22:41:07.651788" elapsed="0.000191"/>
</kw>
<arg>获取期货U本位其他交易对详情</arg>
<arg>/v1/future-u/market/public/symbol/detail</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T22:41:07.647950" elapsed="0.004091"/>
</kw>
<doc>验证期货U本位其他交易对详情接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:07.436758" elapsed="0.215411"/>
</test>
<doc>期货U本位交易对详情接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:07.003922" elapsed="0.648555"/>
</suite>
<status status="PASS" start="2026-05-28T22:41:07.002911" elapsed="0.650482"/>
</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-28T22:41:07.658404" 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-28T22:41:07.658232" elapsed="0.000198"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.658804" 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-28T22:41:07.658692" elapsed="0.000146"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:07.658510" elapsed="0.000353"/>
</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-28T22:41:07.658958" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:07.658885" elapsed="0.000111"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:07.658489" elapsed="0.000521"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.659496" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:07.659418" 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-28T22:41:07.659690" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:07.659763" elapsed="0.000010"/>
</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-28T22:41:07.659831" elapsed="0.000010"/>
</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-28T22:41:07.659896" elapsed="0.000010"/>
</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-28T22:41:07.659961" elapsed="0.000010"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:07.659562" elapsed="0.000432"/>
</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-28T22:41:07.660113" elapsed="0.000011"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:07.660180" 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-28T22:41:07.660248" elapsed="0.000010"/>
</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-28T22:41:07.660324" 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-28T22:41:07.660423" 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-28T22:41:07.660527" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:07.660626" 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-28T22:41:07.660798" 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-28T22:41:07.660904" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:07.660007" elapsed="0.000941"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.661277" 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-28T22:41:07.661052" elapsed="0.000259"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.661568" 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-28T22:41:07.661398" elapsed="0.000203"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.661896" 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-28T22:41:07.661688" elapsed="0.000267"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.662284" 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-28T22:41:07.662079" elapsed="0.000246"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.662611" 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-28T22:41:07.662425" elapsed="0.000223"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.662961" 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-28T22:41:07.662740" elapsed="0.000255"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.663857" 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-28T22:41:07.663082" elapsed="0.000825"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.664241" 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-28T22:41:07.664026" elapsed="0.000250"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.664554" 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-28T22:41:07.664373" elapsed="0.000214"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:07.660968" elapsed="0.003672"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:07.659552" elapsed="0.005121"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.664975" 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-28T22:41:07.664792" elapsed="0.000231"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:07.665390" 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-28T22:41:07.665128" elapsed="0.000419"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:07.659232" elapsed="0.006379"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:07.665805" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:07.665716" elapsed="0.000130"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:07.657982" elapsed="0.007914"/>
</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-28T22:41:07.668665" 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-28T22:41:07.668073" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:07.669299" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:07.668813" elapsed="0.000577"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:07.668791" elapsed="0.000622"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:07.669447" elapsed="0.000040"/>
</return>
<msg time="2026-05-28T22:41:07.669646" 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-28T22:41:07.667337" elapsed="0.002335"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:08.014708" 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-28T22:41:08.015190" 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 14:41: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', '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': '5b87494177c5fe72adb842cf570d0032', 'X-Transparent': '00-5b87494177c5fe72adb842cf570d0032-7bd45178c5114368-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': 'a02e04b8aedbc849-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1779979268002,"s":"btc_usdt","u":1423261267314,"b":[["73223.7","1793"],["73203.8","2981"],["73203.4","4166"],["73202.5","4644"],["73196.7","761"],["73195.3","427"],["73193.9","511"],["73175.4","4333"],["73161.8","3807"],["73148.3","2026"],["73136.3","1155"],["73113","499"],["73105","19"],["73087.5","1644"],["73079.4","3599"],["73034.9","122"],["73016.7","488"],["73001.9","220"],["72999.8","96"],["72967.6","3381"],["72959.7","4139"],["72959.5","9947"],["72959.4","3746"],["72958.8","8555"],["72955.7","2425"],["72954.1","4159"],["72953.5","11686"],["72952.7","4231"],["72950.7","22547"],["72949.5","4138"],["72948.7","7116"],["72948.5","19784"],["72948.2","14703"],["72948.1","3517"],["72948","3885"],["72947.9","2747"],["72947.6","5586"],["72947.5","8178"],["72947.2","21121"],["72947","6576"],["72946.9","3959"],["72946.7","3993"],["72946.6","1967"],["72945.7","149780"],["72945.5","2736"],["72945.4","34545"],["72945.2","3705"],["72945","26295"],["72944.5","5016"],["72944.3","7399"],["72944.2","3854"],["72943.8","20862"],["72943.5","25240"],["72943.2","4416"],["72943.1","1837"],["72943","5318"],["72942.9","32560"],["72942.8","2631"],["72942.7","2156"],["72942.6","2080"],["72942.4","8322"],["72942.3","13415"],["72942.2","14591"],["72942.1","34516"],["72941.9","4924"],["72941.4","53215"],["72941.2","5266"],["72941.1","29454"],["72941","165791"],["72940.9","18431"],["72940.8","15314"],["72940.7","5494"],["72940.5","4563"],["72940.4","18858"],["72940.3","3975"],["72940.2","6371"],["72940.1","137592"],["72940","185295"],["72939.9","8164"],["72939.8","6717"],["72939.6","17398"],["72939.5","25062"],["72939.4","7919"],["72939.3","10453"],["72939.2","2329"],["72939.1","19158"],["72938.9","6983"],["72938.8","3487"],["72938.6","72888"],["72938.5","34804"],["72938.4","5176"],["72938.2","12089"],["72938.1","73590"],["72938","3238"],["72937.8","16363"],["72937.6","4601"],["72937.5","2848"],["72937.4","9677"],["72937.3","173300"],["72937.2","10002"]],"a":[["73231.7","719"],["73316.6","141"]]},"ts":1779979268002} 
 </msg>
<msg time="2026-05-28T22:41:08.015357" 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-28T22:41:08.015620" 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-28T22:41:07.670184" elapsed="0.345473"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:08.015816" elapsed="0.000109"/>
</return>
<msg time="2026-05-28T22:41:08.016186" 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-28T22:41:07.669827" elapsed="0.346394"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.017756" 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-28T22:41:08.017170" elapsed="0.000660"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.018411" 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-28T22:41:08.017968" elapsed="0.000471"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.018699" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:08.018557" elapsed="0.000185"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:08.016698" elapsed="0.002114"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.019520" 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-28T22:41:08.018925" elapsed="0.000656"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.020446" level="INFO">${data} = {'t': 1779979268002, 's': 'btc_usdt', 'u': 1423261267314, 'b': [['73223.7', '1793'], ['73203.8', '2981'], ['73203.4', '4166'], ['73202.5', '4644'], ['73196.7', '761'], ['73195.3', '427'], ['73193.9', ...</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-28T22:41:08.019822" elapsed="0.000652"/>
</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-28T22:41:08.020585" elapsed="0.000132"/>
</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-28T22:41:08.020833" elapsed="0.000117"/>
</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-28T22:41:08.021064" elapsed="0.000105"/>
</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-28T22:41:08.021257" elapsed="0.000103"/>
</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-28T22:41:08.021649" elapsed="0.000305"/>
</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-28T22:41:08.022231" elapsed="0.001953"/>
</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-28T22:41:08.024751" elapsed="0.001110"/>
</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-28T22:41:08.026122" elapsed="0.000584"/>
</kw>
<doc>验证期货U本位深度数据接口功能（BTC/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:07.665972" elapsed="0.360887"/>
</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-28T22:41:08.032003" 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-28T22:41:08.030940" elapsed="0.001117"/>
</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-28T22:41:08.032987" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:08.032250" elapsed="0.000812"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:08.032213" elapsed="0.000879"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:08.033145" elapsed="0.000052"/>
</return>
<msg time="2026-05-28T22:41:08.033447" 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-28T22:41:08.029699" elapsed="0.003774"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:08.335719" 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-28T22:41:08.335888" 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 14:41: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', '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': '2cc2f7d7842238a52368bb5b5992f0e3', 'X-Transparent': '00-2cc2f7d7842238a52368bb5b5992f0e3-d25ed9ae7b9b6083-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': 'a02e04b989dec849-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1779979268263,"s":"eth_usdt","u":1423125091545,"b":[],"a":[]},"ts":1779979268263} 
 </msg>
<msg time="2026-05-28T22:41:08.335952" 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-28T22:41:08.336165" 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-28T22:41:08.034442" elapsed="0.301754"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:08.336324" elapsed="0.000098"/>
</return>
<msg time="2026-05-28T22:41:08.336590" 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-28T22:41:08.033714" elapsed="0.302899"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.337637" 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-28T22:41:08.337257" elapsed="0.000429"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.338407" 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-28T22:41:08.337776" elapsed="0.000741"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.338957" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:08.338750" elapsed="0.000267"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:08.336937" elapsed="0.002207"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.339715" 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-28T22:41:08.339247" elapsed="0.000509"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.340228" level="INFO">${data} = {'t': 1779979268263, '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-28T22:41:08.339847" elapsed="0.000402"/>
</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-28T22:41:08.340335" elapsed="0.000112"/>
</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-28T22:41:08.340528" elapsed="0.000094"/>
</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-28T22:41:08.340700" elapsed="0.000100"/>
</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-28T22:41:08.340885" elapsed="0.000096"/>
</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-28T22:41:08.341061" elapsed="0.000103"/>
</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-28T22:41:08.341235" elapsed="0.000362"/>
</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-28T22:41:08.341672" elapsed="0.000347"/>
</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-28T22:41:08.342089" elapsed="0.000396"/>
</kw>
<doc>验证期货U本位深度数据接口功能（ETH/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:08.027137" elapsed="0.315470"/>
</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-28T22:41:08.347129" 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-28T22:41:08.346230" elapsed="0.000931"/>
</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-28T22:41:08.347697" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:08.347261" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:08.347242" elapsed="0.000519"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:08.347790" elapsed="0.000025"/>
</return>
<msg time="2026-05-28T22:41:08.347931" 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-28T22:41:08.345650" elapsed="0.002298"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:08.460483" 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-28T22:41:08.460756" 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 14:41: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', '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': 'e3079f19bc01e6ea89b4f07ba28b7e26', 'X-Transparent': '00-e3079f19bc01e6ea89b4f07ba28b7e26-ee3e3876807b2c04-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': 'a02e04bb8fd9c849-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1779979268449,"s":"sol_usdt","u":1423125089951,"b":[],"a":[["280.00","100"],["300.00","100"]]},"ts":1779979268449} 
 </msg>
<msg time="2026-05-28T22:41:08.460946" 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-28T22:41:08.461353" 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-28T22:41:08.348342" elapsed="0.113096"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:08.461750" elapsed="0.000103"/>
</return>
<msg time="2026-05-28T22:41:08.462156" 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-28T22:41:08.348068" elapsed="0.114129"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.465538" 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-28T22:41:08.464469" elapsed="0.001228"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.466754" 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-28T22:41:08.466020" elapsed="0.000758"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.467081" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:08.466888" elapsed="0.000249"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:08.463045" elapsed="0.004180"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.467992" 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-28T22:41:08.467389" elapsed="0.000662"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.468701" level="INFO">${data} = {'t': 1779979268449, '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-28T22:41:08.468198" elapsed="0.000533"/>
</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-28T22:41:08.468862" elapsed="0.000132"/>
</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-28T22:41:08.469093" elapsed="0.000114"/>
</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-28T22:41:08.469303" elapsed="0.000118"/>
</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-28T22:41:08.469523" elapsed="0.000124"/>
</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-28T22:41:08.469738" elapsed="0.000101"/>
</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-28T22:41:08.469928" elapsed="0.000491"/>
</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-28T22:41:08.470513" elapsed="0.000922"/>
</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-28T22:41:08.472065" elapsed="0.001058"/>
</kw>
<doc>验证期货U本位深度数据接口功能（SOL/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:08.342818" elapsed="0.130550"/>
</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-28T22:41:08.478140" 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-28T22:41:08.477401" elapsed="0.000794"/>
</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-28T22:41:08.479310" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:08.478416" elapsed="0.001407"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:08.478369" elapsed="0.001618"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:08.480091" elapsed="0.000069"/>
</return>
<msg time="2026-05-28T22:41:08.480598" 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-28T22:41:08.476425" elapsed="0.004212"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:08.609379" 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-28T22:41:08.609550" 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 14:41: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', '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': 'f76ec50f9331c704176598fc759de5a2', 'X-Transparent': '00-f76ec50f9331c704176598fc759de5a2-034812ccef6f8759-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': 'a02e04bc59f7c849-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1779979268595,"s":"btc_usdt","u":1423261267314,"b":[["73223.7","1793"],["73203.8","2981"],["73203.4","4166"],["73202.5","4644"],["73196.7","761"],["73195.3","427"],["73193.9","511"],["73175.4","4333"],["73161.8","3807"],["73148.3","2026"],["73136.3","1155"],["73113","499"],["73105","19"],["73087.5","1644"],["73079.4","3599"],["73034.9","122"],["73016.7","488"],["73001.9","220"],["72999.8","96"],["72967.6","3381"],["72959.7","4139"],["72959.5","9947"],["72959.4","3746"],["72958.8","8555"],["72955.7","2425"],["72954.1","4159"],["72953.5","11686"],["72952.7","4231"],["72950.7","22547"],["72949.5","4138"],["72948.7","7116"],["72948.5","19784"],["72948.2","14703"],["72948.1","3517"],["72948","3885"],["72947.9","2747"],["72947.6","5586"],["72947.5","8178"],["72947.2","21121"],["72947","6576"],["72946.9","3959"],["72946.7","3993"],["72946.6","1967"],["72945.7","149780"],["72945.5","2736"],["72945.4","34545"],["72945.2","3705"],["72945","26295"],["72944.5","5016"],["72944.3","7399"],["72944.2","3854"],["72943.8","20862"],["72943.5","25240"],["72943.2","4416"],["72943.1","1837"],["72943","5318"],["72942.9","32560"],["72942.8","2631"],["72942.7","2156"],["72942.6","2080"],["72942.4","8322"],["72942.3","13415"],["72942.2","14591"],["72942.1","34516"],["72941.9","4924"],["72941.4","53215"],["72941.2","5266"],["72941.1","29454"],["72941","165791"],["72940.9","18431"],["72940.8","15314"],["72940.7","5494"],["72940.5","4563"],["72940.4","18858"],["72940.3","3975"],["72940.2","6371"],["72940.1","137592"],["72940","185295"],["72939.9","8164"],["72939.8","6717"],["72939.6","17398"],["72939.5","25062"],["72939.4","7919"],["72939.3","10453"],["72939.2","2329"],["72939.1","19158"],["72938.9","6983"],["72938.8","3487"],["72938.6","72888"],["72938.5","34804"],["72938.4","5176"],["72938.2","12089"],["72938.1","73590"],["72938","3238"],["72937.8","16363"],["72937.6","4601"],["72937.5","2848"],["72937.4","9677"],["72937.3","173300"],["72937.2","10002"],["72937.1","190296"],["72936.9","7119"],["72936.8","7103"],["72936.7","24853"],["72936.6","38589"],["72936.5","35894"],["72936.3","17733"],["72936.2","2509"],["72936.1","10808"],["72936","5291"],["72935.9","17740"],["72935.8","7889"],["72935.7","3530"],["72935.6","2548"],["72935.5","132274"],["72935.4","6895"],["72935.1","5330"],["72935","5209"],["72934.9","6100"],["72934.8","18413"],["72934.7","5862"],["72934.6","8238"],["72934.5","5035"],["72934.3","2317"],["72934.2","3598"],["72934.1","10684"],["72934","4517"],["72933.7","27348"],["72933.6","1286"],["72933.4","6521"],["72933.3","22864"],["72933.2","5043"],["72933.1","9104"],["72933","16171"],["72932.8","2937"],["72932.7","8869"],["72932.6","38238"],["72932.4","9293"],["72932.2","65825"],["72932.1","1769"],["72931.9","3757"],["72931.8","3550"],["72931.7","10493"],["72931.6","5306"],["72931.4","3773"],["72931.2","144160"],["72931","58841"],["72930.9","2199"],["72930.7","25003"],["72930.6","57732"],["72930.5","3065"],["72930.4","21690"],["72930.2","2299"],["72930.1","40209"],["72929.9","2728"],["72929.8","10154"],["72929.6","2517"],["72929.5","2500"],["72929.3","8175"],["72929.2","16221"],["72929","4121"],["72928.8","4135"],["72928.7","6214"],["72928.6","4505"],["72928.5","3971"],["72928.1","10600"],["72927.8","5328"],["72927.4","2571"],["72927.3","10618"],["72927.1","15815"],["72926.8","7537"],["72926.6","36522"],["72926","18253"],["72925.9","5950"],["72925.8","2295"],["72925.6","31622"],["72925.5","31527"],["72925.3","74260"],["72925.2","28376"],["72925","5779"],["72924.9","17119"],["72924.7","6534"],["72924.3","2771"],["72924.2","1949"],["72924","3259"],["72923.8","3297"],["72923.7","2472"],["72923.6","3878"],["72923.4","4224"],["72923.3","28114"],["72923","8848"],["72922.8","4810"],["72922.6","2135"],["72922.3","4067"],["72922.1","12110"],["72921.8","28893"],["72921.5","5173"],["72921.4","3017"],["72920.3","3756"],["72920.2","22240"],["72920.1","40389"],["72919.9","8054"],["72919.8","31521"],["72919.6","7201"],["72919.5","37051"],["72919.4","4074"],["72919.3","7948"],["72919","16240"],["72918.9","33768"],["72918.7","6611"],["72918.6","4046"],["72918.5","29405"],["72918.4","129300"],["72918.3","9167"],["72918.1","2678"],["72918","24660"],["72917.9","5983"],["72917.8","2589"],["72917.7","6158"],["72917.6","2753"],["72917.5","10440"],["72917.4","6303"],["72917.3","26624"],["72917.2","7969"],["72916.9","4105"],["72916.8","14016"],["72916.7","4723"],["72916.6","11683"],["72916.5","3989"],["72916.4","34046"],["72916.3","11327"],["72916.2","171310"],["72916.1","146800"],["72916","152860"],["72915.9","4876"],["72915.8","27672"],["72915.7","46698"],["72915.6","22324"],["72915.4","3512"],["72915.3","1688"],["72915.2","6896"],["72915.1","2209"],["72915","4670"],["72914.8","2918"],["72914.7","2450"],["72914.5","9117"],["72914.4","29484"],["72914.3","2375"],["72914.2","51346"],["72914.1","4213"],["72914","23236"],["72913.9","163417"],["72913.8","4121"],["72913.7","31616"],["72913.6","6336"],["72913.5","15267"],["72913.4","9067"],["72913.3","4351"],["72913.2","1071"],["72912.9","2510"],["72912.8","6444"],["72912.6","1970"],["72912.1","2960"],["72911.7","10005"],["72911.6","42747"],["72911.5","2614"],["72911.3","2937"],["72911.2","11688"],["72911.1","3619"],["72910.9","15710"],["72910.8","3434"],["72910.6","3436"],["72910.4","14173"],["72910.3","2197"],["72910.1","5578"],["72909.7","3193"],["72909.4","7004"],["72909.3","828"],["72909.1","4645"],["72908.8","2316"],["72908.6","1739"],["72908.3","1106"],["72908.1","23010"],["72908","18180"],["72907.9","5650"],["72907.8","3408"],["72907.6","3987"],["72907.1","23596"],["72907","5172"],["72906.8","3554"],["72906.6","6250"],["72906.5","15623"],["72906.4","2300"],["72906.2","27351"],["72906.1","2560"],["72906","5728"],["72905.9","37630"],["72905.8","29202"],["72905.7","5621"],["72905.3","16770"],["72905.2","13306"],["72905.1","8415"],["72905","12512"],["72904.9","1946"],["72904.8","44618"],["72904.5","4110"],["72904.3","24520"],["72904.2","24818"],["72903.8","2100"],["72903.5","14207"],["72903.4","5280"],["72903.3","3761"],["72903.1","3790"],["72902.8","4263"],["72902.4","15233"],["72902.2","2775"],["72902.1","2353"],["72901.9","4877"],["72901.8","19648"],["72901.7","9710"],["72901.5","4827"],["72901.2","20746"],["72901","2282"],["72900.8","2471"],["72900.6","7688"],["72900.4","10557"],["72900.2","2129"],["72900.1","28716"],["72900","49304"],["72899.8","6567"],["72899.7","20603"],["72899.6","6187"],["72899.5","29610"],["72899.3","29171"],["72899.2","2904"],["72899.1","43701"],["72899","49832"],["72898.9","29688"],["72898.8","33336"],["72898.5","32842"],["72898.4","4915"],["72898.3","27054"],["72898.2","201742"],["72898.1","11721"],["72898","19242"],["72897.8","6891"],["72897.7","5718"],["72897.6","8163"],["72897.4","14073"],["72897.3","2075"],["72897","25688"],["72896.9","4920"],["72896.8","3067"],["72896.7","17184"],["72896.6","6222"],["72896.5","4446"],["72896.4","6067"],["72896.3","10692"],["72896.2","48978"],["72896","2584"],["72895.9","13865"],["72895.8","26703"],["72895.7","19743"],["72895.6","21772"],["72895.5","56773"],["72895.2","10693"],["72895.1","4576"],["72895","25024"],["72894.9","4907"],["72894.8","6656"],["72894.6","5150"],["72894.3","32706"],["72894.2","19193"],["72894.1","10461"],["72894","8181"],["72893.9","5066"],["72893.8","10488"],["72893.7","4098"],["72893.5","11128"],["72893.4","18918"],["72893.3","7059"],["72893.2","22307"],["72893.1","8387"],["72893","133157"],["72892.9","19732"],["72892.8","11659"],["72892.7","10619"],["72892.6","38585"],["72892.5","9554"],["72892.3","5757"],["72892.2","154528"],["72892.1","175560"],["72892","6182"],["72891.9","15300"],["72891.8","158880"],["72891.7","25187"],["72891.6","5171"],["72891.4","3330"],["72891.3","5885"],["72891.2","14504"],["72891.1","16579"],["72891","4869"],["72890.9","8712"],["72890.8","12924"],["72890.7","21149"],["72890.6","196426"],["72890.5","14313"],["72890.3","31156"],["72890.2","84762"],["72890.1","40101"],["72890","10427"],["72889.9","25746"],["72889.7","3032"],["72889.6","30339"],["72889.5","119740"],["72889.3","17250"],["72889.2","8902"],["72889.1","75566"],["72889","147240"],["72888.9","2235"],["72888.8","23706"],["72888.7","4752"],["72888.6","13711"],["72888.5","6402"],["72888.4","57443"],["72888.3","36942"],["72888.1","19689"],["72888","4858"],["72887.9","22564"],["72887.8","5217"],["72887.7","5174"],["72887.6","7441"],["72887.5","3387"],["72887.4","34972"],["72887.3","9493"],["72887.1","9451"],["72887","21304"],["72886.9","57518"],["72886.6","128069"],["72886.5","24995"],["72886.4","3033"],["72886.3","148116"],["72886.1","38769"],["72886","34490"],["72885.9","3699"],["72885.8","3736"],["72885.7","13100"],["72885.6","1895"],["72885.5","35629"],["72885.4","126474"],["72885.2","8930"],["72885.1","4477"],["72885","8743"],["72884.9","16424"],["72884.8","3819"],["72884.7","4609"],["72884.5","3976"],["72884.3","39987"],["72884.2","5664"],["72884.1","3797"],["72884","3270"],["72883.8","15742"],["72883.7","15982"],["72883.6","21908"],["72883.4","13491"],["72883.2","8203"],["72882.9","22437"],["72882.8","24048"],["72882.7","4927"],["72882.5","9384"],["72882.3","8668"],["72882.2","3320"],["72882.1","2045"],["72882","27740"],["72881.9","55471"],["72881.8","11221"],["72881.7","5370"],["72881.6","3046"],["72881.5","2654"],["72881.4","3755"],["72881.3","47600"],["72881.2","10082"],["72881.1","4266"],["72881","4487"],["72880.9","2804"],["72880.8","28969"],["72880.7","10465"],["72880.6","6316"],["72880.5","4781"],["72880.3","11593"],["72880.2","8349"],["72880.1","6914"],["72879.9","2228"],["72879.4","3758"],["72877.9","9107"],["72877.5","16011"],["72876.1","3261"],["72874.6","3820"],["72873.1","201"],["72872.8","3975"],["72872.6","3000"],["72871.8","4263"],["72871.6","12368"],["72870.9","2096"],["72865.9","1349"],["72865.8","7309"],["72864.9","4031"],["72864.7","3914"],["72863.6","4376"]],"a":[["73231.7","719"],["73316.6","141"]]},"ts":1779979268595} 
 </msg>
<msg time="2026-05-28T22:41:08.609770" 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-28T22:41:08.609919" 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-28T22:41:08.481543" elapsed="0.128405"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:08.610029" elapsed="0.000044"/>
</return>
<msg time="2026-05-28T22:41:08.610224" 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-28T22:41:08.480963" elapsed="0.129286"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.611339" 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-28T22:41:08.610827" elapsed="0.000575"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.611978" 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-28T22:41:08.611523" elapsed="0.000481"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.612240" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:08.612111" elapsed="0.000172"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:08.610483" elapsed="0.001853"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.613128" 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-28T22:41:08.612436" elapsed="0.000762"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.614028" level="INFO">${data} = {'t': 1779979268595, 's': 'btc_usdt', 'u': 1423261267314, 'b': [['73223.7', '1793'], ['73203.8', '2981'], ['73203.4', '4166'], ['73202.5', '4644'], ['73196.7', '761'], ['73195.3', '427'], ['73193.9', ...</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-28T22:41:08.613308" elapsed="0.000750"/>
</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-28T22:41:08.614164" elapsed="0.000120"/>
</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-28T22:41:08.614370" elapsed="0.000106"/>
</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-28T22:41:08.614561" elapsed="0.000106"/>
</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-28T22:41:08.614750" elapsed="0.000107"/>
</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-28T22:41:08.614940" elapsed="0.000200"/>
</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-28T22:41:08.615228" elapsed="0.000414"/>
</kw>
<doc>验证期货U本位深度数据接口不同深度级别功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:08.473702" elapsed="0.142047"/>
</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-28T22:41:08.618669" 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-28T22:41:08.618111" elapsed="0.000585"/>
</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-28T22:41:08.619308" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:08.618829" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:08.618801" elapsed="0.000577"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:08.619408" elapsed="0.000028"/>
</return>
<msg time="2026-05-28T22:41:08.619580" 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-28T22:41:08.617486" elapsed="0.002116"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:08.735765" 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-28T22:41:08.736509" 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 14:41: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', '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': '39af3f5a0eb9c2fa0303a535c648e431', 'X-Transparent': '00-39af3f5a0eb9c2fa0303a535c648e431-869d3b70cb66a662-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.016', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02e04bd3bffc849-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1779979268724} 
 </msg>
<msg time="2026-05-28T22:41:08.736769" 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-28T22:41:08.737092" 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-28T22:41:08.620035" elapsed="0.117115"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:08.737324" elapsed="0.000092"/>
</return>
<msg time="2026-05-28T22:41:08.737748" 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-28T22:41:08.619721" elapsed="0.118082"/>
</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-28T22:41:08.738301" elapsed="0.002205"/>
</kw>
<doc>验证期货U本位深度数据接口错误处理（无效交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:08.615922" elapsed="0.124869"/>
</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-28T22:41:08.747034" 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-28T22:41:08.745938" elapsed="0.001204"/>
</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-28T22:41:08.748693" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:08.747549" elapsed="0.001270"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:08.747481" elapsed="0.001378"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:08.748916" elapsed="0.000051"/>
</return>
<msg time="2026-05-28T22:41:08.749258" 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-28T22:41:08.744057" elapsed="0.005238"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:08.867365" 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-28T22:41:08.867555" 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 14:41: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', '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': '91a7d2871d80ae1e361f2e1856cd21ee', 'X-Transparent': '00-91a7d2871d80ae1e361f2e1856cd21ee-bf4e2cab0e6d7cab-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': 'a02e04be0e47c849-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1779979268857} 
 </msg>
<msg time="2026-05-28T22:41:08.867708" 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-28T22:41:08.867870" 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-28T22:41:08.750128" elapsed="0.117766"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:08.867990" elapsed="0.000059"/>
</return>
<msg time="2026-05-28T22:41:08.868201" 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-28T22:41:08.749557" elapsed="0.118668"/>
</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-28T22:41:08.868398" elapsed="0.001199"/>
</kw>
<doc>验证期货U本位深度数据接口参数验证（缺少symbol参数）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:08.741142" elapsed="0.128629"/>
</test>
<doc>期货U本位深度数据接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:07.655307" elapsed="1.214823"/>
</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-28T22:41:08.874549" 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-28T22:41:08.874381" elapsed="0.000192"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.874903" 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-28T22:41:08.874802" elapsed="0.000136"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:08.874644" 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-28T22:41:08.875050" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:08.874981" elapsed="0.000107"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:08.874625" elapsed="0.000477"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.875567" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:08.875480" elapsed="0.000119"/>
</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-28T22:41:08.875759" 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-28T22:41:08.875847" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:08.875927" elapsed="0.000012"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:08.876007" 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-28T22:41:08.876087" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:08.875646" elapsed="0.000474"/>
</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-28T22:41:08.876243" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:08.876327" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:08.876410" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:08.876490" 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-28T22:41:08.876570" 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-28T22:41:08.876650" elapsed="0.000012"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:08.876728" 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-28T22:41:08.876806" elapsed="0.000037"/>
</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-28T22:41:08.876912" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:08.876136" elapsed="0.000810"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.877213" 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-28T22:41:08.877026" elapsed="0.000245"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.877576" 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-28T22:41:08.877384" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.877868" 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-28T22:41:08.877705" elapsed="0.000195"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.878145" 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-28T22:41:08.877984" elapsed="0.000191"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.878415" 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-28T22:41:08.878258" elapsed="0.000187"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.878685" 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-28T22:41:08.878527" elapsed="0.000187"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.878956" 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-28T22:41:08.878794" elapsed="0.000192"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.879227" 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-28T22:41:08.879064" elapsed="0.000192"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.879497" 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-28T22:41:08.879334" elapsed="0.000193"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:08.876961" elapsed="0.002592"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:08.875634" elapsed="0.003936"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.879768" 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-28T22:41:08.879643" elapsed="0.000161"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:08.880101" 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-28T22:41:08.879883" elapsed="0.000366"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:08.875299" elapsed="0.005004"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:08.880455" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:08.880383" elapsed="0.000104"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:08.874176" elapsed="0.006352"/>
</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-28T22:41:08.882878" 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-28T22:41:08.882410" elapsed="0.000491"/>
</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-28T22:41:08.883350" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:08.882988" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:08.882974" elapsed="0.000436"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:08.883433" elapsed="0.000023"/>
</return>
<msg time="2026-05-28T22:41:08.883571" 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-28T22:41:08.881802" elapsed="0.001788"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:09.177141" 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-28T22:41:09.177324" 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 14:41: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', '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': 'a50fb163f855f9b92bcb0f5fdd469ae1', 'X-Transparent': '00-a50fb163f855f9b92bcb0f5fdd469ae1-d0eae81fe73defdc-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': 'a02e04bfe84049dd-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"symbol":"btc_usdt","fundingRate":0.001238,"nextCollectionTime":1779980400000,"collectionInternal":1},"ts":1779979269161} 
 </msg>
<msg time="2026-05-28T22:41:09.177380" 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-28T22:41:09.177483" 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-28T22:41:08.883946" elapsed="0.293550"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:09.177552" elapsed="0.000034"/>
</return>
<msg time="2026-05-28T22:41:09.177667" 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-28T22:41:08.883690" elapsed="0.293988"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.178222" 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-28T22:41:09.177983" elapsed="0.000267"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.178486" 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-28T22:41:09.178302" elapsed="0.000196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.178597" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:09.178542" elapsed="0.000074"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:09.177803" elapsed="0.000844"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.178910" 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-28T22:41:09.178695" elapsed="0.000236"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.179218" level="INFO">${data} = {'symbol': 'btc_usdt', 'fundingRate': 0.001238, 'nextCollectionTime': 1779980400000, '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-28T22:41:09.178980" elapsed="0.000251"/>
</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-28T22:41:09.179280" elapsed="0.000058"/>
</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-28T22:41:09.179384" elapsed="0.000070"/>
</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-28T22:41:09.179502" elapsed="0.000057"/>
</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-28T22:41:09.179604" elapsed="0.000056"/>
</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-28T22:41:09.179711" elapsed="0.000235"/>
</kw>
<doc>验证期货U本位资金费率接口功能（BTC/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:08.880577" elapsed="0.299484"/>
</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-28T22:41:09.181572" 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-28T22:41:09.181293" elapsed="0.000294"/>
</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-28T22:41:09.181878" elapsed="0.000009"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:09.181651" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:09.181636" elapsed="0.000299"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:09.181950" elapsed="0.000017"/>
</return>
<msg time="2026-05-28T22:41:09.182038" 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-28T22:41:09.180935" elapsed="0.001114"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:09.386150" 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-28T22:41:09.386356" 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 14:41: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', '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': '2c34de7ea9e52aac6bebed75d6622e24', 'X-Transparent': '00-2c34de7ea9e52aac6bebed75d6622e24-f39634f73ae97623-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': 'a02e04c0cac349dd-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":1779979269294} 
 </msg>
<msg time="2026-05-28T22:41:09.386452" 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-28T22:41:09.386647" 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-28T22:41:09.182267" elapsed="0.204410"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:09.386774" elapsed="0.000055"/>
</return>
<msg time="2026-05-28T22:41:09.386996" 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-28T22:41:09.182111" elapsed="0.204911"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.388818" 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-28T22:41:09.387723" elapsed="0.001201"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.389790" 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-28T22:41:09.389159" elapsed="0.000666"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.390142" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:09.389972" elapsed="0.000207"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:09.387291" elapsed="0.002962"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.390816" 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-28T22:41:09.390354" elapsed="0.000499"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.391333" 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-28T22:41:09.390947" elapsed="0.000409"/>
</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-28T22:41:09.391450" elapsed="0.000119"/>
</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-28T22:41:09.391683" elapsed="0.000119"/>
</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-28T22:41:09.391895" elapsed="0.000116"/>
</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-28T22:41:09.392107" elapsed="0.000111"/>
</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-28T22:41:09.392322" elapsed="0.000480"/>
</kw>
<doc>验证期货U本位资金费率接口功能（ETH/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:09.180302" elapsed="0.212673"/>
</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-28T22:41:09.397145" 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-28T22:41:09.396316" elapsed="0.000924"/>
</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-28T22:41:09.398074" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:09.397410" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:09.397383" elapsed="0.000797"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:09.398221" elapsed="0.000035"/>
</return>
<msg time="2026-05-28T22:41:09.398474" 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-28T22:41:09.395156" elapsed="0.003350"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:09.521871" 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-28T22:41:09.522132" 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 14:41: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', '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': '1de3563ec975cf929d764cefd1916659', 'X-Transparent': '00-1de3563ec975cf929d764cefd1916659-c422d18c58eec24a-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': 'a02e04c22ebb49dd-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":1779979269506} 
 </msg>
<msg time="2026-05-28T22:41:09.522243" 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-28T22:41:09.522592" 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-28T22:41:09.399200" elapsed="0.123448"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:09.522783" elapsed="0.000085"/>
</return>
<msg time="2026-05-28T22:41:09.523165" 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-28T22:41:09.398720" elapsed="0.124482"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.525316" 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-28T22:41:09.524435" elapsed="0.000993"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.526298" 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-28T22:41:09.525650" elapsed="0.000681"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.526623" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:09.526477" elapsed="0.000192"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:09.523657" elapsed="0.003091"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.527765" 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-28T22:41:09.526873" elapsed="0.000986"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.529718" 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-28T22:41:09.528100" elapsed="0.001780"/>
</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-28T22:41:09.530269" elapsed="0.000399"/>
</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-28T22:41:09.530949" elapsed="0.000451"/>
</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-28T22:41:09.531709" elapsed="0.001145"/>
</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-28T22:41:09.533082" elapsed="0.000206"/>
</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-28T22:41:09.533402" elapsed="0.000632"/>
</kw>
<doc>验证期货U本位资金费率接口功能（SOL/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:09.393356" elapsed="0.140857"/>
</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-28T22:41:09.538803" 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-28T22:41:09.537650" elapsed="0.001258"/>
</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-28T22:41:09.540269" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:09.539262" elapsed="0.001119"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:09.539199" elapsed="0.001216"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:09.540469" elapsed="0.000050"/>
</return>
<msg time="2026-05-28T22:41:09.540824" 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-28T22:41:09.536661" elapsed="0.004199"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:09.667496" 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-28T22:41:09.667644" 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 14:41: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', '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': 'd04d59427617b61e10e3f7cabd40592d', 'X-Transparent': '00-d04d59427617b61e10e3f7cabd40592d-84f231594b39348b-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': 'a02e04c3094049dd-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1779979269653} 
 </msg>
<msg time="2026-05-28T22:41:09.667706" 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-28T22:41:09.667872" 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-28T22:41:09.542239" elapsed="0.125657"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:09.668048" elapsed="0.000053"/>
</return>
<msg time="2026-05-28T22:41:09.668269" 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-28T22:41:09.541213" elapsed="0.127080"/>
</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-28T22:41:09.668461" elapsed="0.001765"/>
</kw>
<doc>验证期货U本位资金费率接口错误处理（无效交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:09.534506" elapsed="0.135924"/>
</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-28T22:41:09.675975" 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-28T22:41:09.674983" elapsed="0.001051"/>
</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-28T22:41:09.677188" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:09.676291" elapsed="0.001037"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:09.676240" elapsed="0.001122"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:09.677441" elapsed="0.000100"/>
</return>
<msg time="2026-05-28T22:41:09.678074" 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-28T22:41:09.673472" elapsed="0.004646"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:09.800880" 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-28T22:41:09.800995" 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 14:41: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', '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': '4be17a6769e401acffabf385b6d2fb56', 'X-Transparent': '00-4be17a6769e401acffabf385b6d2fb56-0e1498723aabc0b7-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': 'a02e04c3dba849dd-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1779979269784} 
 </msg>
<msg time="2026-05-28T22:41:09.801053" 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-28T22:41:09.801648" 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-28T22:41:09.679224" elapsed="0.122491"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:09.801864" elapsed="0.000078"/>
</return>
<msg time="2026-05-28T22:41:09.802093" 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-28T22:41:09.678400" elapsed="0.123712"/>
</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-28T22:41:09.802293" elapsed="0.000893"/>
</kw>
<doc>验证期货U本位资金费率接口参数验证（缺少symbol参数）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:09.671001" elapsed="0.132261"/>
</test>
<doc>期货U本位资金费率接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:08.870986" elapsed="0.932444"/>
</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-28T22:41:09.807167" 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-28T22:41:09.807046" elapsed="0.000139"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.807433" 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-28T22:41:09.807361" elapsed="0.000095"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:09.807234" elapsed="0.000238"/>
</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-28T22:41:09.807530" elapsed="0.000011"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:09.807484" elapsed="0.000071"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:09.807221" elapsed="0.000342"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.807976" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:09.807914" 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-28T22:41:09.808143" elapsed="0.000011"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:09.808213" 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-28T22:41:09.808279" elapsed="0.000009"/>
</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-28T22:41:09.808344" elapsed="0.000133"/>
</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-28T22:41:09.808529" elapsed="0.000010"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:09.808042" elapsed="0.000511"/>
</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-28T22:41:09.808637" 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-28T22:41:09.808689" 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-28T22:41:09.808738" 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-28T22:41:09.808785" 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-28T22:41:09.808833" 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-28T22:41:09.808880" 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-28T22:41:09.808926" 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-28T22:41:09.808973" 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-28T22:41:09.809019" elapsed="0.000112"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:09.808564" elapsed="0.000583"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.809315" 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-28T22:41:09.809200" elapsed="0.000135"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.809489" 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-28T22:41:09.809395" elapsed="0.000112"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.809639" 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-28T22:41:09.809553" elapsed="0.000103"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.809790" 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-28T22:41:09.809701" elapsed="0.000107"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.809944" 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-28T22:41:09.809854" elapsed="0.000107"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.810098" 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-28T22:41:09.810007" elapsed="0.000109"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.810311" 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-28T22:41:09.810161" elapsed="0.000169"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.810498" 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-28T22:41:09.810381" elapsed="0.000135"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.810704" 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-28T22:41:09.810564" elapsed="0.000157"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:09.809157" elapsed="0.001645"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:09.808031" elapsed="0.002783"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.810993" 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-28T22:41:09.810891" elapsed="0.000129"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:09.811254" 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-28T22:41:09.811078" elapsed="0.000290"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:09.807704" elapsed="0.003707"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:09.811511" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:09.811466" elapsed="0.000065"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:09.806889" elapsed="0.004668"/>
</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-28T22:41:09.813846" 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-28T22:41:09.812941" elapsed="0.001021"/>
</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-28T22:41:09.815055" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:09.814270" elapsed="0.000960"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:09.814066" elapsed="0.001206"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:09.815359" elapsed="0.000094"/>
</return>
<msg time="2026-05-28T22:41:09.815837" 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-28T22:41:09.812499" elapsed="0.003398"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:10.190728" 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-28T22:41:10.190959" 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 14:41: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', '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': 'b551bd47bc4c755ea74449ff21588cdd', 'X-Transparent': '00-b551bd47bc4c755ea74449ff21588cdd-7724f0aa6b243e50-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': 'a02e04c64d6875cb-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":"1989.66","t":1779979270002},{"s":"sol_usdt","p":"81.05","t":1779979270005},{"s":"bnb_usdt","p":"599.36","t":1776061637754},{"s":"ordi_usdt","p":"2.256","t":1776061643383},{"s":"btc_usdt","p":"73008.05","t":1779979270000},{"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.09818","t":1779979270007},{"s":"raysol_usdt","p":"3.3966","t":1747980978061},{"s":"btx_usdt","p":"0.0445","t":1776061697756},{"s":"btc_usdc","p":"72965.5269","t":1779979269997},{"s":"xaut_usdt","p":"4543.7984","t":1779095550280}],"ts":1779979270173} 
 </msg>
<msg time="2026-05-28T22:41:10.191101" 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-28T22:41:10.191529" 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-28T22:41:09.816413" elapsed="0.375160"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:10.191730" elapsed="0.000084"/>
</return>
<msg time="2026-05-28T22:41:10.192114" 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-28T22:41:09.816023" elapsed="0.376128"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.196220" 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-28T22:41:10.195047" elapsed="0.001283"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.198285" 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-28T22:41:10.196586" elapsed="0.001780"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.199384" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:10.198755" elapsed="0.000758"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:10.193962" elapsed="0.005725"/>
</kw>
<kw name="验证指数价格数据不为空">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.201987" 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-28T22:41:10.201133" elapsed="0.000956"/>
</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-28T22:41:10.202327" elapsed="0.000463"/>
</kw>
<arg>${response.json()}</arg>
<status status="PASS" start="2026-05-28T22:41:10.200026" elapsed="0.002887"/>
</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-28T22:41:10.204461" elapsed="0.001201"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.206511" 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-28T22:41:10.206063" elapsed="0.000532"/>
</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-28T22:41:10.207893" elapsed="0.000375"/>
</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-28T22:41:10.208665" elapsed="0.000701"/>
</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-28T22:41:10.209639" elapsed="0.000254"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.211949" 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-28T22:41:10.211573" elapsed="0.000509"/>
</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-28T22:41:10.212376" elapsed="0.002083"/>
</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-28T22:41:10.214817" elapsed="0.000753"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.210151" elapsed="0.005557"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.217050" 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-28T22:41:10.216846" elapsed="0.000263"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T22:41:10.217241" elapsed="0.000178"/>
</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-28T22:41:10.217542" elapsed="0.000337"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.215950" elapsed="0.002008"/>
</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-28T22:41:10.218945" elapsed="0.000377"/>
</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-28T22:41:10.219442" elapsed="0.000204"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.219966" 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-28T22:41:10.219764" elapsed="0.000229"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.220200" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:10.220267" 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-28T22:41:10.220098" elapsed="0.000190"/>
</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-28T22:41:10.220384" elapsed="0.000216"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.218140" elapsed="0.002519"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T22:41:10.207337" elapsed="0.013370"/>
</kw>
<var name="${index_price}">{'s': 'trb_usdt', 'p': '15.164', 't': 1776061641025}</var>
<status status="PASS" start="2026-05-28T22:41:10.207083" elapsed="0.013652"/>
</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-28T22:41:10.221222" elapsed="0.000145"/>
</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-28T22:41:10.221472" elapsed="0.000142"/>
</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-28T22:41:10.221712" elapsed="0.000141"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.222801" 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-28T22:41:10.222537" elapsed="0.000305"/>
</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-28T22:41:10.222942" 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-28T22:41:10.223177" elapsed="0.000145"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.221974" elapsed="0.001404"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.224156" 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-28T22:41:10.224029" 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-28T22:41:10.224294" elapsed="0.000133"/>
</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-28T22:41:10.224632" elapsed="0.000181"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.223488" elapsed="0.001439"/>
</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-28T22:41:10.225777" elapsed="0.000269"/>
</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-28T22:41:10.226171" elapsed="0.000201"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.226670" 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-28T22:41:10.226488" elapsed="0.000209"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.226914" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:10.226982" 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-28T22:41:10.226802" elapsed="0.000205"/>
</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-28T22:41:10.227172" elapsed="0.000275"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.225098" elapsed="0.002417"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T22:41:10.220963" elapsed="0.006603"/>
</kw>
<var name="${index_price}">{'s': 'xrp_usdt', 'p': '1.8284', 't': 1744189287376}</var>
<status status="PASS" start="2026-05-28T22:41:10.220833" elapsed="0.006758"/>
</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-28T22:41:10.228081" elapsed="0.000151"/>
</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-28T22:41:10.228329" elapsed="0.000133"/>
</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-28T22:41:10.228554" elapsed="0.000132"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.229462" 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-28T22:41:10.229335" 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-28T22:41:10.229592" elapsed="0.000126"/>
</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-28T22:41:10.229807" elapsed="0.000134"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.228801" elapsed="0.001191"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.230706" 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-28T22:41:10.230588" elapsed="0.000156"/>
</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-28T22:41:10.230828" elapsed="0.000121"/>
</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-28T22:41:10.231037" elapsed="0.000134"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.230098" elapsed="0.001124"/>
</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-28T22:41:10.231822" elapsed="0.000196"/>
</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-28T22:41:10.232118" elapsed="0.000158"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.232519" level="INFO">${timestamp_str} = 1779979270002</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:10.232369" elapsed="0.000174"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.232725" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:10.232785" 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-28T22:41:10.232631" elapsed="0.000173"/>
</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-28T22:41:10.232893" elapsed="0.000186"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.231330" elapsed="0.001800"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T22:41:10.227812" elapsed="0.005358"/>
</kw>
<var name="${index_price}">{'s': 'eth_usdt', 'p': '1989.66', 't': 1779979270002}</var>
<status status="PASS" start="2026-05-28T22:41:10.227687" elapsed="0.005504"/>
</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-28T22:41:10.233726" elapsed="0.000130"/>
</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-28T22:41:10.233951" elapsed="0.000128"/>
</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-28T22:41:10.234231" elapsed="0.000147"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.235164" 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-28T22:41:10.235049" elapsed="0.000150"/>
</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-28T22:41:10.235284" elapsed="0.000108"/>
</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-28T22:41:10.235471" elapsed="0.000112"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.234495" elapsed="0.001136"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.236251" 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-28T22:41:10.236153" elapsed="0.000130"/>
</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-28T22:41:10.236357" elapsed="0.000099"/>
</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-28T22:41:10.236531" elapsed="0.000113"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.235731" elapsed="0.000956"/>
</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-28T22:41:10.237214" elapsed="0.000157"/>
</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-28T22:41:10.237450" elapsed="0.000126"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.237776" level="INFO">${timestamp_str} = 1779979270005</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:10.237655" elapsed="0.000140"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.237946" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:10.237997" 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-28T22:41:10.237871" elapsed="0.000143"/>
</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-28T22:41:10.238090" elapsed="0.000157"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.236781" elapsed="0.001509"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T22:41:10.233370" elapsed="0.004954"/>
</kw>
<var name="${index_price}">{'s': 'sol_usdt', 'p': '81.05', 't': 1779979270005}</var>
<status status="PASS" start="2026-05-28T22:41:10.233265" elapsed="0.005077"/>
</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-28T22:41:10.238678" elapsed="0.000108"/>
</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-28T22:41:10.238865" elapsed="0.000109"/>
</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-28T22:41:10.239054" elapsed="0.000108"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.239758" 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-28T22:41:10.239663" elapsed="0.000129"/>
</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-28T22:41:10.239863" elapsed="0.000098"/>
</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-28T22:41:10.240040" elapsed="0.000108"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.239255" elapsed="0.000935"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.240767" 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-28T22:41:10.240671" elapsed="0.000127"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T22:41:10.240868" 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-28T22:41:10.241044" elapsed="0.001177"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.240273" elapsed="0.001992"/>
</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-28T22:41:10.242762" elapsed="0.000136"/>
</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-28T22:41:10.242967" elapsed="0.000109"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.243252" 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-28T22:41:10.243144" elapsed="0.000177"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.243547" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:10.243613" 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-28T22:41:10.243441" elapsed="0.000190"/>
</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-28T22:41:10.243710" elapsed="0.000183"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.242357" elapsed="0.001581"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T22:41:10.238488" elapsed="0.005484"/>
</kw>
<var name="${index_price}">{'s': 'bnb_usdt', 'p': '599.36', 't': 1776061637754}</var>
<status status="PASS" start="2026-05-28T22:41:10.238405" elapsed="0.005587"/>
</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-28T22:41:10.244339" elapsed="0.000108"/>
</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-28T22:41:10.244520" elapsed="0.000100"/>
</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-28T22:41:10.244690" elapsed="0.000099"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.245378" 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-28T22:41:10.245284" 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-28T22:41:10.245477" elapsed="0.000095"/>
</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-28T22:41:10.245642" elapsed="0.000104"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.244876" elapsed="0.000909"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.246348" 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-28T22:41:10.246246" elapsed="0.000131"/>
</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-28T22:41:10.246441" 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-28T22:41:10.246602" elapsed="0.000094"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.245865" elapsed="0.000866"/>
</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-28T22:41:10.247148" elapsed="0.000134"/>
</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-28T22:41:10.247353" elapsed="0.000112"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.247632" 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-28T22:41:10.247530" elapsed="0.000118"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.247774" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:10.247814" 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-28T22:41:10.247711" elapsed="0.000117"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:10.247887" elapsed="0.000129"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.246807" elapsed="0.001244"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T22:41:10.244151" elapsed="0.003927"/>
</kw>
<var name="${index_price}">{'s': 'ordi_usdt', 'p': '2.256', 't': 1776061643383}</var>
<status status="PASS" start="2026-05-28T22:41:10.244061" elapsed="0.004033"/>
</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-28T22:41:10.248376" elapsed="0.000092"/>
</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-28T22:41:10.248532" elapsed="0.000092"/>
</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-28T22:41:10.248686" elapsed="0.000088"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.249353" 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-28T22:41:10.249274" 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-28T22:41:10.249440" elapsed="0.000085"/>
</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-28T22:41:10.249587" elapsed="0.000088"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.248848" elapsed="0.000867"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.250270" 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-28T22:41:10.250183" elapsed="0.000116"/>
</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-28T22:41:10.250363" 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-28T22:41:10.250513" elapsed="0.000094"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.249821" elapsed="0.000823"/>
</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-28T22:41:10.251060" elapsed="0.000124"/>
</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-28T22:41:10.251247" elapsed="0.000106"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.251539" level="INFO">${timestamp_str} = 1779979270000</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:10.251416" elapsed="0.000139"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.251681" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:10.251730" 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-28T22:41:10.251618" elapsed="0.000126"/>
</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-28T22:41:10.251803" elapsed="0.000137"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.250722" elapsed="0.001253"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T22:41:10.248219" elapsed="0.003784"/>
</kw>
<var name="${index_price}">{'s': 'btc_usdt', 'p': '73008.05', 't': 1779979270000}</var>
<status status="PASS" start="2026-05-28T22:41:10.248145" elapsed="0.003875"/>
</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-28T22:41:10.252302" elapsed="0.000087"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T22:41:10.252454" 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-28T22:41:10.252603" elapsed="0.000089"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.253177" 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-28T22:41:10.253099" elapsed="0.000103"/>
</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-28T22:41:10.253262" elapsed="0.000084"/>
</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-28T22:41:10.253408" elapsed="0.000087"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.252765" elapsed="0.000764"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.254005" 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-28T22:41:10.253926" elapsed="0.000104"/>
</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-28T22:41:10.254090" 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-28T22:41:10.254234" elapsed="0.000090"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.253598" elapsed="0.000762"/>
</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-28T22:41:10.254741" elapsed="0.000110"/>
</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-28T22:41:10.254908" elapsed="0.000091"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.255147" 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-28T22:41:10.255058" elapsed="0.000103"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.255274" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:10.255381" 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-28T22:41:10.255217" elapsed="0.000177"/>
</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-28T22:41:10.255450" elapsed="0.000120"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.254431" elapsed="0.001171"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T22:41:10.252150" elapsed="0.003478"/>
</kw>
<var name="${index_price}">{'s': '1000shib_usdt', 'p': '0.0058', 't': 1776061707972}</var>
<status status="PASS" start="2026-05-28T22:41:10.252075" elapsed="0.003567"/>
</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-28T22:41:10.255904" elapsed="0.000081"/>
</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-28T22:41:10.256044" elapsed="0.000081"/>
</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-28T22:41:10.256183" elapsed="0.000081"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.256705" 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-28T22:41:10.256632" elapsed="0.000096"/>
</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-28T22:41:10.256782" elapsed="0.000074"/>
</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-28T22:41:10.256913" elapsed="0.000082"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.256331" elapsed="0.000696"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.257462" 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-28T22:41:10.257389" elapsed="0.000097"/>
</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-28T22:41:10.257541" elapsed="0.000075"/>
</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-28T22:41:10.257674" elapsed="0.000084"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.257089" elapsed="0.000702"/>
</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-28T22:41:10.258159" 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-28T22:41:10.258324" elapsed="0.000087"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.258547" 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-28T22:41:10.258464" elapsed="0.000096"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.258672" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:10.258706" 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-28T22:41:10.258618" elapsed="0.000100"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:10.258768" elapsed="0.000107"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.257858" elapsed="0.001047"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T22:41:10.255748" elapsed="0.003181"/>
</kw>
<var name="${index_price}">{'s': 'ada_usdt', 'p': '0.2394', 't': 1776061663345}</var>
<status status="PASS" start="2026-05-28T22:41:10.255685" elapsed="0.003257"/>
</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-28T22:41:10.259181" elapsed="0.000079"/>
</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-28T22:41:10.259314" elapsed="0.000075"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T22:41:10.259443" elapsed="0.000077"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.260023" 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-28T22:41:10.259933" 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-28T22:41:10.260113" elapsed="0.000082"/>
</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-28T22:41:10.260254" elapsed="0.000082"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.259584" elapsed="0.000786"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.260912" 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-28T22:41:10.260839" elapsed="0.000098"/>
</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-28T22:41:10.260993" elapsed="0.000081"/>
</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-28T22:41:10.261129" elapsed="0.000089"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.260442" elapsed="0.000808"/>
</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-28T22:41:10.261627" elapsed="0.000118"/>
</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-28T22:41:10.261831" elapsed="0.000095"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.262075" 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-28T22:41:10.261984" elapsed="0.000105"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.262212" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:10.262249" 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-28T22:41:10.262153" 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-28T22:41:10.262314" elapsed="0.000111"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.261321" elapsed="0.001135"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T22:41:10.259041" elapsed="0.003438"/>
</kw>
<var name="${index_price}">{'s': 'arb_usdt', 'p': '0.11', 't': 1776061665430}</var>
<status status="PASS" start="2026-05-28T22:41:10.258983" elapsed="0.003509"/>
</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-28T22:41:10.262734" elapsed="0.000079"/>
</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-28T22:41:10.262868" 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-28T22:41:10.262998" elapsed="0.000076"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.263491" 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-28T22:41:10.263424" elapsed="0.000089"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T22:41:10.263565" elapsed="0.000072"/>
</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-28T22:41:10.263692" elapsed="0.000077"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.263139" elapsed="0.000660"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.264204" 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-28T22:41:10.264136" elapsed="0.000091"/>
</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-28T22:41:10.264277" elapsed="0.000071"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T22:41:10.264401" elapsed="0.000078"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.263858" elapsed="0.000652"/>
</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-28T22:41:10.264850" elapsed="0.000102"/>
</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-28T22:41:10.265006" elapsed="0.000084"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.265227" level="INFO">${timestamp_str} = 1779979270007</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:10.265143" elapsed="0.000097"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.265344" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:10.265378" 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-28T22:41:10.265291" elapsed="0.000100"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:10.265442" elapsed="0.000108"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.264574" elapsed="0.001006"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T22:41:10.262600" elapsed="0.003003"/>
</kw>
<var name="${index_price}">{'s': 'doge_usdt', 'p': '0.09818', 't': 1779979270007}</var>
<status status="PASS" start="2026-05-28T22:41:10.262538" elapsed="0.003078"/>
</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-28T22:41:10.265849" 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-28T22:41:10.265982" elapsed="0.000076"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T22:41:10.266109" elapsed="0.000144"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.266660" 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-28T22:41:10.266586" elapsed="0.000095"/>
</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-28T22:41:10.266730" elapsed="0.000068"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T22:41:10.266863" elapsed="0.000074"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.266317" elapsed="0.000650"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.267354" 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-28T22:41:10.267287" elapsed="0.000088"/>
</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-28T22:41:10.267424" elapsed="0.000069"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T22:41:10.267542" elapsed="0.000074"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.267022" elapsed="0.000624"/>
</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-28T22:41:10.267984" elapsed="0.000098"/>
</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-28T22:41:10.268134" elapsed="0.000082"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.268356" 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-28T22:41:10.268268" elapsed="0.000101"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.268472" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:10.268505" 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-28T22:41:10.268419" elapsed="0.000098"/>
</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-28T22:41:10.268565" elapsed="0.000102"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.267708" elapsed="0.000987"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T22:41:10.265717" elapsed="0.003000"/>
</kw>
<var name="${index_price}">{'s': 'raysol_usdt', 'p': '3.3966', 't': 1747980978061}</var>
<status status="PASS" start="2026-05-28T22:41:10.265659" elapsed="0.003070"/>
</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-28T22:41:10.268949" elapsed="0.000074"/>
</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-28T22:41:10.269074" elapsed="0.000080"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T22:41:10.269214" elapsed="0.000074"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.269685" 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-28T22:41:10.269621" elapsed="0.000086"/>
</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-28T22:41:10.269754" elapsed="0.000069"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T22:41:10.269873" elapsed="0.000075"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.269356" elapsed="0.000620"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.270367" 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-28T22:41:10.270296" elapsed="0.000092"/>
</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-28T22:41:10.270435" elapsed="0.000068"/>
</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-28T22:41:10.270551" elapsed="0.000074"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.270032" elapsed="0.000621"/>
</kw>
<kw name="验证指数价格时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>指数价格时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:10.270967" elapsed="0.000149"/>
</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-28T22:41:10.271166" elapsed="0.000079"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.271371" 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-28T22:41:10.271294" elapsed="0.000089"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.271481" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:10.271513" 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-28T22:41:10.271431" 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-28T22:41:10.271571" elapsed="0.000099"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.270712" elapsed="0.001000"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T22:41:10.268824" elapsed="0.002910"/>
</kw>
<var name="${index_price}">{'s': 'btx_usdt', 'p': '0.0445', 't': 1776061697756}</var>
<status status="PASS" start="2026-05-28T22:41:10.268769" elapsed="0.002977"/>
</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-28T22:41:10.271958" 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-28T22:41:10.272081" elapsed="0.000069"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T22:41:10.272200" elapsed="0.000068"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.272645" 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-28T22:41:10.272583" elapsed="0.000083"/>
</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-28T22:41:10.272712" elapsed="0.000065"/>
</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-28T22:41:10.272826" elapsed="0.000069"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.272328" elapsed="0.000594"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.273288" level="INFO">Length is 10.</msg>
<arg>${price}</arg>
<arg>指数价格价格不应该为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T22:41:10.273227" elapsed="0.000082"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T22:41:10.273355" elapsed="0.000064"/>
</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-28T22:41:10.273468" elapsed="0.000070"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.272976" elapsed="0.000590"/>
</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-28T22:41:10.273885" 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-28T22:41:10.274024" elapsed="0.000074"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.274217" level="INFO">${timestamp_str} = 1779979269997</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:10.274145" elapsed="0.000084"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.274320" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:10.274350" 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-28T22:41:10.274273" elapsed="0.000087"/>
</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-28T22:41:10.274404" elapsed="0.000091"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.273624" elapsed="0.000897"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T22:41:10.271839" elapsed="0.002702"/>
</kw>
<var name="${index_price}">{'s': 'btc_usdc', 'p': '72965.5269', 't': 1779979269997}</var>
<status status="PASS" start="2026-05-28T22:41:10.271783" elapsed="0.002769"/>
</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-28T22:41:10.274760" elapsed="0.000068"/>
</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-28T22:41:10.274875" elapsed="0.000075"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T22:41:10.274996" elapsed="0.000068"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.275423" 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-28T22:41:10.275364" elapsed="0.000079"/>
</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-28T22:41:10.275494" elapsed="0.000062"/>
</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-28T22:41:10.275605" elapsed="0.000124"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.275119" elapsed="0.000638"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.276118" 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-28T22:41:10.276059" elapsed="0.000079"/>
</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-28T22:41:10.276195" elapsed="0.000076"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T22:41:10.276317" elapsed="0.000068"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.275811" elapsed="0.000657"/>
</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-28T22:41:10.276778" 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-28T22:41:10.276932" elapsed="0.000072"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.277122" 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-28T22:41:10.277050" elapsed="0.000083"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.277223" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:10.277253" 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-28T22:41:10.277178" elapsed="0.000085"/>
</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-28T22:41:10.277306" elapsed="0.000098"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.276522" elapsed="0.000907"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T22:41:10.274639" elapsed="0.002810"/>
</kw>
<var name="${index_price}">{'s': 'xaut_usdt', 'p': '4543.7984', 't': 1779095550280}</var>
<status status="PASS" start="2026-05-28T22:41:10.274587" elapsed="0.002873"/>
</iter>
<var>${index_price}</var>
<value>@{index_price_list}</value>
<status status="PASS" start="2026-05-28T22:41:10.206730" elapsed="0.070743"/>
</for>
<arg>${response.json()['data']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.203397" elapsed="0.074103"/>
</kw>
<doc>测试获取所有期货U本位指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:09.811598" elapsed="0.465968"/>
</test>
<test id="s1-s2-s2-s3-t2" name="获取期货U本位单个指数价格" line="16">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.278357" 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-28T22:41:10.278272" elapsed="0.000096"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.279053" 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-28T22:41:10.278780" elapsed="0.000286"/>
</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-28T22:41:10.279346" elapsed="0.000009"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:10.279125" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:10.279113" elapsed="0.000270"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:10.279398" elapsed="0.000022"/>
</return>
<msg time="2026-05-28T22:41:10.279491" 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-28T22:41:10.278467" elapsed="0.001035"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:10.434103" 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-28T22:41:10.434498" 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 14:41: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', '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': '6458ac41f9e0078df123671dfbefaacc', 'X-Transparent': '00-6458ac41f9e0078df123671dfbefaacc-a54c1e41a5a1bc11-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': 'a02e04c798a175cb-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":[{"s":"btc_usdt","p":"73008.05","t":1779979270000}],"ts":1779979270385} 
 </msg>
<msg time="2026-05-28T22:41:10.434623" 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-28T22:41:10.434839" 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-28T22:41:10.279736" elapsed="0.155138"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:10.435043" elapsed="0.000069"/>
</return>
<msg time="2026-05-28T22:41:10.435303" 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-28T22:41:10.279562" elapsed="0.155764"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.436634" 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-28T22:41:10.436043" elapsed="0.000673"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.437330" 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-28T22:41:10.436839" elapsed="0.000515"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.437583" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:10.437457" elapsed="0.000167"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:10.435607" elapsed="0.002093"/>
</kw>
<kw name="验证指数价格数据不为空">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.439577" 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-28T22:41:10.438734" elapsed="0.000926"/>
</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-28T22:41:10.439856" elapsed="0.000340"/>
</kw>
<arg>${response.json()}</arg>
<status status="PASS" start="2026-05-28T22:41:10.437893" elapsed="0.002385"/>
</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-28T22:41:10.441252" elapsed="0.000250"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.442078" 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-28T22:41:10.441639" elapsed="0.000493"/>
</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-28T22:41:10.442859" elapsed="0.000183"/>
</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-28T22:41:10.443154" elapsed="0.000144"/>
</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-28T22:41:10.443398" elapsed="0.000143"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.444352" 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-28T22:41:10.444221" elapsed="0.000175"/>
</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-28T22:41:10.444492" elapsed="0.000139"/>
</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-28T22:41:10.444733" elapsed="0.000145"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.443662" elapsed="0.001275"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.445709" 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-28T22:41:10.445582" elapsed="0.000168"/>
</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-28T22:41:10.445847" elapsed="0.000132"/>
</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-28T22:41:10.446116" elapsed="0.000151"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.445049" elapsed="0.001274"/>
</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-28T22:41:10.447001" elapsed="0.000211"/>
</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-28T22:41:10.447314" elapsed="0.000164"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.447741" level="INFO">${timestamp_str} = 1779979270000</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:10.447577" elapsed="0.000188"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.447961" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:10.448024" 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-28T22:41:10.447863" elapsed="0.000183"/>
</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-28T22:41:10.448139" elapsed="0.000206"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.446463" elapsed="0.001936"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-05-28T22:41:10.442555" elapsed="0.005887"/>
</kw>
<var name="${index_price}">{'s': 'btc_usdt', 'p': '73008.05', 't': 1779979270000}</var>
<status status="PASS" start="2026-05-28T22:41:10.442398" elapsed="0.006113"/>
</iter>
<var>${index_price}</var>
<value>@{index_price_list}</value>
<status status="PASS" start="2026-05-28T22:41:10.442206" elapsed="0.006334"/>
</for>
<arg>${response.json()['data']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.440491" elapsed="0.008099"/>
</kw>
<kw name="验证单个指数价格符号">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.449390" level="INFO">Length is 1.</msg>
<msg time="2026-05-28T22:41:10.449457" 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-28T22:41:10.449281" elapsed="0.000199"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.449712" 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-28T22:41:10.449576" elapsed="0.000190"/>
</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-28T22:41:10.449871" elapsed="0.000485"/>
</kw>
<arg>${response.json()['data']}</arg>
<arg>btc_usdt</arg>
<status status="PASS" start="2026-05-28T22:41:10.448705" elapsed="0.001712"/>
</kw>
<doc>测试获取单个期货U本位指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:10.277669" elapsed="0.172883"/>
</test>
<test id="s1-s2-s2-s3-t3" name="获取期货U本位符号指数价格_BTC" line="27">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.452073" 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-28T22:41:10.451920" elapsed="0.000175"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.453623" 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-28T22:41:10.452951" elapsed="0.000706"/>
</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-28T22:41:10.454288" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:10.453784" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:10.453761" elapsed="0.000609"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:10.454403" elapsed="0.000060"/>
</return>
<msg time="2026-05-28T22:41:10.454623" 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-28T22:41:10.452298" elapsed="0.002350"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:10.579910" 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-28T22:41:10.580130" 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 14:41: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', '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': 'd574b0d2aadb05ea23a0049c768a3dbe', 'X-Transparent': '00-d574b0d2aadb05ea23a0049c768a3dbe-2704340320c1c2bb-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': 'a02e04c8bbc875cb-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"btc_usdt","p":"73008.05","t":1779979270000},"ts":1779979270563} 
 </msg>
<msg time="2026-05-28T22:41:10.580237" 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-28T22:41:10.580499" 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-28T22:41:10.455171" elapsed="0.125373"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:10.580685" elapsed="0.000108"/>
</return>
<msg time="2026-05-28T22:41:10.581162" 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-28T22:41:10.454790" elapsed="0.126474"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.583440" 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-28T22:41:10.582403" elapsed="0.001161"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.584828" 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-28T22:41:10.583786" elapsed="0.001111"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.585560" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:10.585202" elapsed="0.000472"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:10.581817" elapsed="0.004461"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.587518" level="INFO">${data} = {'s': 'btc_usdt', 'p': '73008.05', 't': 1779979270000}</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-28T22:41:10.586734" elapsed="0.000864"/>
</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-28T22:41:10.588595" elapsed="0.000349"/>
</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-28T22:41:10.589280" elapsed="0.000383"/>
</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-28T22:41:10.590071" elapsed="0.000405"/>
</kw>
<arg>${data}</arg>
<status status="PASS" start="2026-05-28T22:41:10.587948" elapsed="0.002764"/>
</kw>
<kw name="验证符号指数价格符号">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.593084" 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-28T22:41:10.592619" elapsed="0.000568"/>
</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-28T22:41:10.593420" elapsed="0.000249"/>
</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-28T22:41:10.593867" elapsed="0.000339"/>
</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-28T22:41:10.594439" elapsed="0.000272"/>
</kw>
<arg>${data['s']}</arg>
<arg>btc_usdt</arg>
<status status="PASS" start="2026-05-28T22:41:10.591113" elapsed="0.003717"/>
</kw>
<kw name="验证符号指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.597168" 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-28T22:41:10.596726" elapsed="0.000540"/>
</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-28T22:41:10.597535" elapsed="0.000294"/>
</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-28T22:41:10.597977" elapsed="0.000210"/>
</kw>
<arg>${data['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:10.595122" elapsed="0.003154"/>
</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-28T22:41:10.598402" elapsed="0.000758"/>
</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-28T22:41:10.599314" elapsed="0.000289"/>
</kw>
<doc>测试获取BTC期货U本位符号指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:10.450747" elapsed="0.149035"/>
</test>
<test id="s1-s2-s2-s3-t4" name="获取期货U本位符号指数价格_ETH" line="41">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.602306" 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-28T22:41:10.602014" elapsed="0.000329"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:10.604724" 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-28T22:41:10.603921" elapsed="0.000842"/>
</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-28T22:41:10.605512" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:10.604935" elapsed="0.000633"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:10.604905" elapsed="0.000691"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:10.605636" elapsed="0.000038"/>
</return>
<msg time="2026-05-28T22:41:10.605925" 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-28T22:41:10.602671" elapsed="0.003276"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:11.097534" 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-28T22:41:11.097772" 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 14:41: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', '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': '700574b781acda77fe8d4bdc20e7dfbe', 'X-Transparent': '00-700574b781acda77fe8d4bdc20e7dfbe-7b5b35df7c444a7a-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': 'a02e04c9ae4075cb-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"eth_usdt","p":"1989.66","t":1779979270002},"ts":1779979270714} 
 </msg>
<msg time="2026-05-28T22:41:11.097880" 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-28T22:41:11.098109" 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-28T22:41:10.606840" elapsed="0.491298"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:11.098244" elapsed="0.000064"/>
</return>
<msg time="2026-05-28T22:41:11.098471" 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-28T22:41:10.606130" elapsed="0.492363"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.099897" 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-28T22:41:11.099277" elapsed="0.000695"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.100864" 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-28T22:41:11.100208" elapsed="0.000686"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.101164" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:11.101034" elapsed="0.000167"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:11.098777" elapsed="0.002486"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.101835" level="INFO">${data} = {'s': 'eth_usdt', 'p': '1989.66', 't': 1779979270002}</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-28T22:41:11.101364" elapsed="0.000493"/>
</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-28T22:41:11.102536" elapsed="0.000362"/>
</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-28T22:41:11.103033" elapsed="0.000123"/>
</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-28T22:41:11.103246" elapsed="0.000132"/>
</kw>
<arg>${data}</arg>
<status status="PASS" start="2026-05-28T22:41:11.102028" elapsed="0.001405"/>
</kw>
<kw name="验证符号指数价格符号">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.104958" 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-28T22:41:11.104612" elapsed="0.000441"/>
</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-28T22:41:11.105253" elapsed="0.000152"/>
</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-28T22:41:11.105550" elapsed="0.000342"/>
</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-28T22:41:11.106019" elapsed="0.000158"/>
</kw>
<arg>${data['s']}</arg>
<arg>eth_usdt</arg>
<status status="PASS" start="2026-05-28T22:41:11.103563" elapsed="0.002691"/>
</kw>
<kw name="验证符号指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.107532" 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-28T22:41:11.107292" elapsed="0.000299"/>
</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-28T22:41:11.107804" elapsed="0.000152"/>
</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-28T22:41:11.108046" elapsed="0.000227"/>
</kw>
<arg>${data['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:11.106456" elapsed="0.001923"/>
</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-28T22:41:11.108540" elapsed="0.000991"/>
</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-28T22:41:11.109697" elapsed="0.000359"/>
</kw>
<doc>测试获取ETH期货U本位符号指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:10.600159" elapsed="0.510099"/>
</test>
<test id="s1-s2-s2-s3-t5" name="获取期货U本位符号指数价格_SOL" line="55">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.114013" 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-28T22:41:11.113547" elapsed="0.000515"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.116354" 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-28T22:41:11.115553" elapsed="0.000839"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:11.117344" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:11.116576" elapsed="0.000847"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:11.116533" elapsed="0.000919"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:11.117491" elapsed="0.000040"/>
</return>
<msg time="2026-05-28T22:41:11.117712" 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-28T22:41:11.114430" elapsed="0.003306"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:11.245370" 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-28T22:41:11.245765" 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 14:41:11 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'd0fbd7cd04e29638b1999672a0e4c0c1', 'X-Transparent': '00-d0fbd7cd04e29638b1999672a0e4c0c1-bd2061952319e987-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': 'a02e04ccde9775cb-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"sol_usdt","p":"81.05","t":1779979271070},"ts":1779979271226} 
 </msg>
<msg time="2026-05-28T22:41:11.245953" 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-28T22:41:11.246405" 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-28T22:41:11.118688" elapsed="0.127819"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:11.246715" elapsed="0.000106"/>
</return>
<msg time="2026-05-28T22:41:11.247199" 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-28T22:41:11.117912" elapsed="0.129325"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.249193" 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-28T22:41:11.248119" elapsed="0.001166"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.250694" 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-28T22:41:11.249536" elapsed="0.001361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.251473" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:11.251173" elapsed="0.000372"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:11.247549" elapsed="0.004103"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.252517" level="INFO">${data} = {'s': 'sol_usdt', 'p': '81.05', 't': 1779979271070}</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-28T22:41:11.251835" elapsed="0.000705"/>
</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-28T22:41:11.253353" elapsed="0.000269"/>
</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-28T22:41:11.253792" elapsed="0.000222"/>
</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-28T22:41:11.254192" elapsed="0.000238"/>
</kw>
<arg>${data}</arg>
<status status="PASS" start="2026-05-28T22:41:11.252787" elapsed="0.001740"/>
</kw>
<kw name="验证符号指数价格符号">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.256579" 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-28T22:41:11.256332" elapsed="0.000328"/>
</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-28T22:41:11.256826" elapsed="0.000191"/>
</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-28T22:41:11.257195" 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-28T22:41:11.257605" elapsed="0.000202"/>
</kw>
<arg>${data['s']}</arg>
<arg>sol_usdt</arg>
<status status="PASS" start="2026-05-28T22:41:11.254736" elapsed="0.003185"/>
</kw>
<kw name="验证符号指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.260133" 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-28T22:41:11.259751" elapsed="0.000494"/>
</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-28T22:41:11.260408" elapsed="0.000169"/>
</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-28T22:41:11.260714" elapsed="0.000413"/>
</kw>
<arg>${data['p']}</arg>
<status status="PASS" start="2026-05-28T22:41:11.258241" elapsed="0.003191"/>
</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-28T22:41:11.262036" elapsed="0.001115"/>
</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-28T22:41:11.263387" elapsed="0.000255"/>
</kw>
<doc>测试获取SOL期货U本位符号指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:11.110622" elapsed="0.153182"/>
</test>
<test id="s1-s2-s2-s3-t6" name="获取期货U本位符号指数价格_无效交易对" line="69">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.266499" 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-28T22:41:11.266135" elapsed="0.000399"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.268296" 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-28T22:41:11.267731" elapsed="0.000591"/>
</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-28T22:41:11.269002" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:11.268467" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:11.268431" elapsed="0.000661"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:11.269142" elapsed="0.000059"/>
</return>
<msg time="2026-05-28T22:41:11.269374" 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-28T22:41:11.266878" elapsed="0.002521"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:11.483237" 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-28T22:41:11.483792" 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 14:41:11 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '72cf831274914818c88ba0260b1f1a7f', 'X-Transparent': '00-72cf831274914818c88ba0260b1f1a7f-543466e41bfac08a-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.020', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02e04cdc91c75cb-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1779979271380} 
 </msg>
<msg time="2026-05-28T22:41:11.483976" 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-28T22:41:11.484352" 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-28T22:41:11.270464" elapsed="0.213961"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:11.484638" elapsed="0.000122"/>
</return>
<msg time="2026-05-28T22:41:11.485113" 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-28T22:41:11.269659" elapsed="0.215508"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.486255" 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-28T22:41:11.485498" elapsed="0.000907"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.487351" level="INFO">${response_data} = {'code': 1, 'msg': 'failure', 'msgInfo': {'code': 'invalid_symbol', 'template': '无效交易对', 'args': []}, 'data': None, 'ts': 1779979271380}</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-28T22:41:11.486646" elapsed="0.000765"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.488519" 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-28T22:41:11.487647" elapsed="0.000922"/>
</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-28T22:41:11.488685" elapsed="0.000442"/>
</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-28T22:41:11.489222" elapsed="0.000488"/>
</kw>
<doc>测试获取无效交易对的符号指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:11.264177" elapsed="0.225693"/>
</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-28T22:41:11.494901" 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-28T22:41:11.493706" elapsed="0.001251"/>
</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-28T22:41:11.496119" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:11.495162" elapsed="0.001069"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:11.495115" elapsed="0.001155"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:11.496326" elapsed="0.000055"/>
</return>
<msg time="2026-05-28T22:41:11.496679" 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-28T22:41:11.492738" elapsed="0.003967"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:11.619747" 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-28T22:41:11.620008" 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 14:41:11 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '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': 'ed2e29ef422ccaa9cdbcb29178511f37', 'X-Transparent': '00-ed2e29ef422ccaa9cdbcb29178511f37-7d5d2e3a5bfcd7ac-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': 'a02e04cf3d1175cb-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1779979271604} 
 </msg>
<msg time="2026-05-28T22:41:11.620093" 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-28T22:41:11.620315" 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-28T22:41:11.497966" elapsed="0.122411"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:11.620579" elapsed="0.000120"/>
</return>
<msg time="2026-05-28T22:41:11.621127" 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-28T22:41:11.496908" elapsed="0.124290"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.622783" 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-28T22:41:11.621572" elapsed="0.001352"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.624410" level="INFO">${response_data} = {'code': 1, 'msg': 'failure', 'msgInfo': {'code': 'invalid_symbol', 'template': '无效交易对', 'args': ['symbol']}, 'data': None, 'ts': 1779979271604}</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-28T22:41:11.623302" elapsed="0.001186"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.625776" 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-28T22:41:11.624765" elapsed="0.001126"/>
</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-28T22:41:11.626134" elapsed="0.000562"/>
</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-28T22:41:11.626817" elapsed="0.000438"/>
</kw>
<doc>测试缺少symbol参数的符号指数价格请求</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:11.490259" elapsed="0.137193"/>
</test>
<doc>期货U本位指数价格接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:09.803918" elapsed="1.826387"/>
</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-28T22:41:11.639941" 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-28T22:41:11.639690" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.640703" 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-28T22:41:11.640434" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:11.640101" elapsed="0.000728"/>
</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-28T22:41:11.640992" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:11.640871" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:11.640070" elapsed="0.000998"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.642007" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:11.641886" elapsed="0.000171"/>
</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-28T22:41:11.642315" 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-28T22:41:11.642423" 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-28T22:41:11.642527" 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-28T22:41:11.642619" 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-28T22:41:11.642818" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:11.642132" elapsed="0.000727"/>
</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-28T22:41:11.643010" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:11.643104" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:11.643194" 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-28T22:41:11.643286" 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-28T22:41:11.643382" 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-28T22:41:11.643475" 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-28T22:41:11.643564" 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-28T22:41:11.643665" 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-28T22:41:11.643761" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:11.642883" elapsed="0.000923"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.644230" 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-28T22:41:11.643919" elapsed="0.000354"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.644761" 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-28T22:41:11.644370" elapsed="0.000685"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.645986" 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-28T22:41:11.645562" elapsed="0.000494"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.646518" 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-28T22:41:11.646245" elapsed="0.000334"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.647213" 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-28T22:41:11.646884" elapsed="0.000394"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.647706" 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-28T22:41:11.647436" elapsed="0.000321"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.648158" 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-28T22:41:11.647897" elapsed="0.000318"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.648595" 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-28T22:41:11.648342" elapsed="0.000299"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.649011" 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-28T22:41:11.648761" elapsed="0.000295"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:11.643832" elapsed="0.005267"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:11.642109" elapsed="0.007033"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.649475" 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-28T22:41:11.649268" elapsed="0.000262"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:11.649968" 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-28T22:41:11.649634" elapsed="0.000778"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:11.641503" elapsed="0.008997"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.650706" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:11.650611" elapsed="0.000138"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:11.639302" elapsed="0.011499"/>
</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-28T22:41:11.653900" 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-28T22:41:11.653245" elapsed="0.000729"/>
</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-28T22:41:11.654798" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:11.654146" elapsed="0.000715"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:11.654106" elapsed="0.000887"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:11.655069" elapsed="0.000048"/>
</return>
<msg time="2026-05-28T22:41:11.655330" 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-28T22:41:11.652427" elapsed="0.002931"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:11.915174" 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-28T22:41:11.915345" 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 14:41:11 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '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': '5c18e940b2fcc17069e3f3ff5a2873c5', 'X-Transparent': '00-5c18e940b2fcc17069e3f3ff5a2873c5-89afc3fc8484dc6c-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': 'a02e04d1087d1f05-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":1779979271080},{"s":"sol_usdt","p":"85.15","t":1779979271070},{"s":"bnb_usdt","p":"2085","t":1779979271080},{"s":"ordi_usdt","p":"2.256","t":1776061643383},{"s":"btc_usdt","p":"73239.65","t":1779979271064},{"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":1779979271075},{"s":"raysol_usdt","p":"3.3966","t":1747980978061},{"s":"btx_usdt","p":"0.0445","t":1776061697756},{"s":"btc_usdc","p":"72962.7684","t":1779979271050},{"s":"xaut_usdt","p":"4543.7984","t":1779095550280}],"ts":1779979271903} 
 </msg>
<msg time="2026-05-28T22:41:11.915472" 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-28T22:41:11.915698" 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-28T22:41:11.656239" elapsed="0.259485"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:11.915844" elapsed="0.000074"/>
</return>
<msg time="2026-05-28T22:41:11.916097" 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-28T22:41:11.655513" elapsed="0.260606"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.918208" 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-28T22:41:11.917274" elapsed="0.001044"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.919111" 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-28T22:41:11.918523" elapsed="0.000623"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.919425" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:11.919287" elapsed="0.000177"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:11.916457" elapsed="0.003083"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:11.921151" 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': 1779979271080}, {'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-28T22:41:11.919816" elapsed="0.001399"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.921778" 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-28T22:41:11.921460" elapsed="0.000421"/>
</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-28T22:41:11.922220" elapsed="0.000526"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.923405" level="INFO">Length is 15.</msg>
<msg time="2026-05-28T22:41:11.923598" 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-28T22:41:11.923077" elapsed="0.000571"/>
</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-28T22:41:11.923873" elapsed="0.000433"/>
</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-28T22:41:11.926390" elapsed="0.000434"/>
</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-28T22:41:11.927004" elapsed="0.000261"/>
</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-28T22:41:11.927443" elapsed="0.000924"/>
</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-28T22:41:11.928575" elapsed="0.000254"/>
</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-28T22:41:11.929930" elapsed="0.000269"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.930587" 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-28T22:41:11.930376" elapsed="0.000262"/>
</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-28T22:41:11.930770" elapsed="0.000165"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.929218" elapsed="0.001804"/>
</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-28T22:41:11.931640" elapsed="0.000178"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.932114" 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-28T22:41:11.931958" elapsed="0.000198"/>
</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-28T22:41:11.932248" elapsed="0.000207"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.932829" 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-28T22:41:11.932593" elapsed="0.000268"/>
</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-28T22:41:11.932952" elapsed="0.000183"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.931261" elapsed="0.001941"/>
</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-28T22:41:11.933852" elapsed="0.000421"/>
</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-28T22:41:11.934464" elapsed="0.000272"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.935051" 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-28T22:41:11.934857" elapsed="0.000222"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.935265" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:11.935324" 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-28T22:41:11.935174" elapsed="0.000170"/>
</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-28T22:41:11.935430" elapsed="0.000268"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.933399" elapsed="0.002390"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:11.925918" elapsed="0.009939"/>
</kw>
<var name="${mark_price_item}">{'s': 'trb_usdt', 'p': '44.994', 't': 1776061641025}</var>
<status status="PASS" start="2026-05-28T22:41:11.925650" elapsed="0.010238"/>
</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-28T22:41:11.937161" elapsed="0.000622"/>
</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-28T22:41:11.938020" elapsed="0.000330"/>
</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-28T22:41:11.938495" elapsed="0.000213"/>
</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-28T22:41:11.938882" elapsed="0.000215"/>
</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-28T22:41:11.939797" elapsed="0.000155"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.940187" 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-28T22:41:11.940052" elapsed="0.000175"/>
</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-28T22:41:11.940329" elapsed="0.000151"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.939399" elapsed="0.001192"/>
</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-28T22:41:11.941178" elapsed="0.000169"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.942012" 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-28T22:41:11.941448" elapsed="0.000660"/>
</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-28T22:41:11.942385" elapsed="0.000459"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.943656" 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-28T22:41:11.943082" elapsed="0.000658"/>
</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-28T22:41:11.944031" elapsed="0.000704"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.940816" elapsed="0.004077"/>
</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-28T22:41:11.945620" 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-28T22:41:11.946259" elapsed="0.000402"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.947441" 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-28T22:41:11.947015" elapsed="0.000498"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.947850" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:11.947944" 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-28T22:41:11.947683" elapsed="0.000288"/>
</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-28T22:41:11.948098" elapsed="0.000292"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.945162" elapsed="0.003307"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:11.936519" elapsed="0.012010"/>
</kw>
<var name="${mark_price_item}">{'s': 'xrp_usdt', 'p': '1.8795', 't': 1744189287376}</var>
<status status="PASS" start="2026-05-28T22:41:11.936130" elapsed="0.012429"/>
</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-28T22:41:11.949093" elapsed="0.000229"/>
</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-28T22:41:11.949427" elapsed="0.000162"/>
</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-28T22:41:11.949690" 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-28T22:41:11.949941" elapsed="0.000147"/>
</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-28T22:41:11.950493" elapsed="0.000138"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.950865" 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-28T22:41:11.950731" elapsed="0.000178"/>
</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-28T22:41:11.951025" elapsed="0.000156"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.950226" elapsed="0.001012"/>
</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-28T22:41:11.951626" elapsed="0.000136"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.951985" 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-28T22:41:11.951859" elapsed="0.000168"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T22:41:11.952125" elapsed="0.000152"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.952677" 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-28T22:41:11.952494" elapsed="0.000207"/>
</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-28T22:41:11.952800" elapsed="0.000174"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.951365" elapsed="0.001666"/>
</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-28T22:41:11.953422" elapsed="0.000210"/>
</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-28T22:41:11.953736" elapsed="0.000166"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.954174" level="INFO">${timestamp_str} = 1779979271080</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:11.954009" elapsed="0.000189"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.954406" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:11.954471" 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-28T22:41:11.954300" elapsed="0.000192"/>
</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-28T22:41:11.954586" elapsed="0.000209"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.953161" elapsed="0.001690"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:11.948814" elapsed="0.006156"/>
</kw>
<var name="${mark_price_item}">{'s': 'eth_usdt', 'p': '76000', 't': 1779979271080}</var>
<status status="PASS" start="2026-05-28T22:41:11.948671" elapsed="0.006344"/>
</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-28T22:41:11.955582" elapsed="0.000427"/>
</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-28T22:41:11.956120" elapsed="0.000151"/>
</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-28T22:41:11.956360" elapsed="0.000136"/>
</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-28T22:41:11.956580" elapsed="0.000126"/>
</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-28T22:41:11.957063" elapsed="0.000119"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.957382" 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-28T22:41:11.957269" elapsed="0.000151"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T22:41:11.957505" elapsed="0.000129"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.956826" elapsed="0.000857"/>
</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-28T22:41:11.958013" elapsed="0.000119"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.958484" 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-28T22:41:11.958260" elapsed="0.000266"/>
</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-28T22:41:11.958614" elapsed="0.000140"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.959058" 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-28T22:41:11.958853" elapsed="0.000226"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:11.959164" elapsed="0.000149"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.957795" elapsed="0.001570"/>
</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-28T22:41:11.959710" elapsed="0.000183"/>
</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-28T22:41:11.959981" elapsed="0.000146"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.960359" level="INFO">${timestamp_str} = 1779979271070</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:11.960215" elapsed="0.000165"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.960554" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:11.960611" 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-28T22:41:11.960464" elapsed="0.000166"/>
</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-28T22:41:11.960711" elapsed="0.000186"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.959480" elapsed="0.001543"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:11.955301" elapsed="0.005763"/>
</kw>
<var name="${mark_price_item}">{'s': 'sol_usdt', 'p': '85.15', 't': 1779979271070}</var>
<status status="PASS" start="2026-05-28T22:41:11.955161" elapsed="0.005928"/>
</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-28T22:41:11.961698" elapsed="0.000209"/>
</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-28T22:41:11.961998" elapsed="0.000144"/>
</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-28T22:41:11.962228" elapsed="0.000133"/>
</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-28T22:41:11.962446" 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-28T22:41:11.962906" elapsed="0.000120"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.963217" 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-28T22:41:11.963110" elapsed="0.000198"/>
</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-28T22:41:11.963410" elapsed="0.000141"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.962684" elapsed="0.000920"/>
</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-28T22:41:11.963934" elapsed="0.000247"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.964352" 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-28T22:41:11.964257" elapsed="0.000127"/>
</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-28T22:41:11.964459" elapsed="0.000127"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.964800" 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-28T22:41:11.964673" elapsed="0.000146"/>
</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-28T22:41:11.964895" elapsed="0.000126"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.963711" elapsed="0.001352"/>
</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-28T22:41:11.965350" elapsed="0.000149"/>
</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-28T22:41:11.965574" elapsed="0.000124"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.965894" level="INFO">${timestamp_str} = 1779979271080</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:11.965776" elapsed="0.000136"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.966063" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:11.966113" 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-28T22:41:11.965985" elapsed="0.000144"/>
</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-28T22:41:11.966200" elapsed="0.000159"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.965160" elapsed="0.001241"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:11.961291" elapsed="0.005144"/>
</kw>
<var name="${mark_price_item}">{'s': 'bnb_usdt', 'p': '2085', 't': 1779979271080}</var>
<status status="PASS" start="2026-05-28T22:41:11.961174" elapsed="0.005281"/>
</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-28T22:41:11.967009" elapsed="0.000331"/>
</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-28T22:41:11.967447" elapsed="0.000154"/>
</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-28T22:41:11.967689" elapsed="0.000120"/>
</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-28T22:41:11.967890" elapsed="0.000135"/>
</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-28T22:41:11.968325" elapsed="0.000104"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.968652" 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-28T22:41:11.968503" elapsed="0.000181"/>
</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-28T22:41:11.968758" elapsed="0.000113"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.968126" elapsed="0.000792"/>
</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-28T22:41:11.969333" elapsed="0.000127"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.969666" 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-28T22:41:11.969557" elapsed="0.000144"/>
</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-28T22:41:11.969780" elapsed="0.000124"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.970129" 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-28T22:41:11.969988" elapsed="0.000161"/>
</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-28T22:41:11.970227" elapsed="0.000151"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.969013" elapsed="0.001417"/>
</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-28T22:41:11.970779" elapsed="0.000174"/>
</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-28T22:41:11.971035" elapsed="0.000130"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.971376" 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-28T22:41:11.971247" elapsed="0.000149"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.971559" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:11.971651" 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-28T22:41:11.971476" elapsed="0.000205"/>
</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-28T22:41:11.971778" elapsed="0.000204"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.970544" elapsed="0.001485"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:11.966744" elapsed="0.005324"/>
</kw>
<var name="${mark_price_item}">{'s': 'ordi_usdt', 'p': '2.256', 't': 1776061643383}</var>
<status status="PASS" start="2026-05-28T22:41:11.966576" elapsed="0.005514"/>
</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-28T22:41:11.972627" elapsed="0.000176"/>
</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-28T22:41:11.972879" elapsed="0.000122"/>
</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-28T22:41:11.973082" elapsed="0.000109"/>
</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-28T22:41:11.973263" elapsed="0.000106"/>
</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-28T22:41:11.973648" elapsed="0.000099"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.973909" 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-28T22:41:11.973818" elapsed="0.000122"/>
</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-28T22:41:11.974009" elapsed="0.000106"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.973462" elapsed="0.000697"/>
</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-28T22:41:11.974430" elapsed="0.000096"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.974685" 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-28T22:41:11.974595" elapsed="0.000119"/>
</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-28T22:41:11.974781" elapsed="0.000113"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.975140" level="INFO">${price_float} = 73239.65</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-28T22:41:11.974970" elapsed="0.000192"/>
</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-28T22:41:11.975248" elapsed="0.000144"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.974250" elapsed="0.001247"/>
</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-28T22:41:11.975812" elapsed="0.000165"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:11.976049" elapsed="0.000111"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.976337" level="INFO">${timestamp_str} = 1779979271064</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:11.976229" elapsed="0.000123"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.976483" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:11.976525" 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-28T22:41:11.976416" elapsed="0.000122"/>
</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-28T22:41:11.976598" elapsed="0.000136"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.975603" elapsed="0.001169"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:11.972258" elapsed="0.004546"/>
</kw>
<var name="${mark_price_item}">{'s': 'btc_usdt', 'p': '73239.65', 't': 1779979271064}</var>
<status status="PASS" start="2026-05-28T22:41:11.972163" elapsed="0.004659"/>
</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-28T22:41:11.977144" elapsed="0.000200"/>
</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-28T22:41:11.977422" elapsed="0.000113"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T22:41:11.977600" elapsed="0.000094"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T22:41:11.977755" elapsed="0.000093"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T22:41:11.978110" elapsed="0.000102"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.978357" 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-28T22:41:11.978275" elapsed="0.000109"/>
</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-28T22:41:11.978447" elapsed="0.000099"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.977938" elapsed="0.000645"/>
</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-28T22:41:11.978918" elapsed="0.000086"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.979144" 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-28T22:41:11.979066" elapsed="0.000104"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T22:41:11.979230" elapsed="0.000102"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.979506" 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-28T22:41:11.979398" elapsed="0.000123"/>
</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-28T22:41:11.979584" elapsed="0.000105"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.978664" elapsed="0.001059"/>
</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-28T22:41:11.979971" elapsed="0.000124"/>
</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-28T22:41:11.980158" elapsed="0.000102"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.980422" 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-28T22:41:11.980323" elapsed="0.000113"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.980561" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:11.980601" 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-28T22:41:11.980497" elapsed="0.000119"/>
</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-28T22:41:11.980677" elapsed="0.000127"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.979802" elapsed="0.001037"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:11.976971" elapsed="0.003895"/>
</kw>
<var name="${mark_price_item}">{'s': '1000shib_usdt', 'p': '0.0058', 't': 1776061707972}</var>
<status status="PASS" start="2026-05-28T22:41:11.976886" elapsed="0.003997"/>
</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-28T22:41:11.981215" elapsed="0.000121"/>
</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-28T22:41:11.981398" 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-28T22:41:11.981554" 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-28T22:41:11.981706" 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-28T22:41:11.982027" elapsed="0.000082"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.982247" 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-28T22:41:11.982170" elapsed="0.000101"/>
</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-28T22:41:11.982341" elapsed="0.000107"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.981872" elapsed="0.000614"/>
</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-28T22:41:11.982724" elapsed="0.000086"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.982948" 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-28T22:41:11.982870" elapsed="0.000103"/>
</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-28T22:41:11.983034" elapsed="0.000100"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.983305" 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-28T22:41:11.983201" elapsed="0.000119"/>
</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-28T22:41:11.983379" elapsed="0.000102"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.982565" elapsed="0.000951"/>
</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-28T22:41:11.983754" elapsed="0.000125"/>
</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-28T22:41:11.983940" elapsed="0.000190"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.984287" 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-28T22:41:11.984191" elapsed="0.000110"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.984418" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:11.984456" 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-28T22:41:11.984358" elapsed="0.000110"/>
</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-28T22:41:11.984524" elapsed="0.000234"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.983594" elapsed="0.001198"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:11.981056" elapsed="0.003766"/>
</kw>
<var name="${mark_price_item}">{'s': 'ada_usdt', 'p': '0.2394', 't': 1776061663345}</var>
<status status="PASS" start="2026-05-28T22:41:11.980981" elapsed="0.003857"/>
</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-28T22:41:11.985109" elapsed="0.000110"/>
</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-28T22:41:11.985277" elapsed="0.000140"/>
</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-28T22:41:11.985486" elapsed="0.000088"/>
</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-28T22:41:11.985634" elapsed="0.000100"/>
</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-28T22:41:11.985973" elapsed="0.000085"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.986211" 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-28T22:41:11.986117" elapsed="0.000120"/>
</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-28T22:41:11.986294" elapsed="0.000089"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.985813" elapsed="0.000650"/>
</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-28T22:41:11.986688" elapsed="0.000081"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.986900" 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-28T22:41:11.986827" elapsed="0.000098"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T22:41:11.986984" elapsed="0.000090"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.987239" 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-28T22:41:11.987136" elapsed="0.000118"/>
</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-28T22:41:11.987312" elapsed="0.000101"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.986538" elapsed="0.000908"/>
</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-28T22:41:11.987674" 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-28T22:41:11.987846" elapsed="0.000091"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.988083" 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-28T22:41:11.987994" elapsed="0.000103"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.988209" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:11.988247" 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-28T22:41:11.988151" elapsed="0.000108"/>
</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-28T22:41:11.988315" elapsed="0.000115"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.987522" elapsed="0.000940"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:11.984964" elapsed="0.003523"/>
</kw>
<var name="${mark_price_item}">{'s': 'arb_usdt', 'p': '0.11', 't': 1776061665430}</var>
<status status="PASS" start="2026-05-28T22:41:11.984894" elapsed="0.003608"/>
</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-28T22:41:11.988764" 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-28T22:41:11.988926" elapsed="0.000084"/>
</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-28T22:41:11.989066" elapsed="0.000085"/>
</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-28T22:41:11.989205" elapsed="0.000083"/>
</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-28T22:41:11.989497" elapsed="0.000143"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.989764" 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-28T22:41:11.989695" elapsed="0.000092"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T22:41:11.989841" elapsed="0.000081"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.989356" elapsed="0.000597"/>
</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-28T22:41:11.990159" elapsed="0.000075"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.990359" 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-28T22:41:11.990288" 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-28T22:41:11.990439" elapsed="0.000084"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.990673" 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-28T22:41:11.990580" elapsed="0.000107"/>
</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-28T22:41:11.990740" elapsed="0.000090"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.990022" 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-28T22:41:11.991067" elapsed="0.000104"/>
</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-28T22:41:11.991245" elapsed="0.000089"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.991480" level="INFO">${timestamp_str} = 1779979271075</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:11.991391" elapsed="0.000102"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.991606" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:11.991640" 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-28T22:41:11.991549" elapsed="0.000103"/>
</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-28T22:41:11.991702" elapsed="0.000112"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.990929" elapsed="0.000916"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:11.988625" elapsed="0.003245"/>
</kw>
<var name="${mark_price_item}">{'s': 'doge_usdt', 'p': '0.09824', 't': 1779979271075}</var>
<status status="PASS" start="2026-05-28T22:41:11.988558" elapsed="0.003326"/>
</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-28T22:41:11.992120" elapsed="0.000100"/>
</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-28T22:41:11.992274" elapsed="0.000081"/>
</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-28T22:41:11.992408" elapsed="0.000077"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T22:41:11.992537" elapsed="0.000078"/>
</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-28T22:41:11.992816" elapsed="0.000072"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.993005" 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-28T22:41:11.992940" elapsed="0.000088"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T22:41:11.993079" elapsed="0.000078"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.992681" elapsed="0.000505"/>
</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-28T22:41:11.993382" elapsed="0.000072"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.993572" 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-28T22:41:11.993505" elapsed="0.000090"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T22:41:11.993645" elapsed="0.000079"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.993866" 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-28T22:41:11.993779" elapsed="0.000100"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:11.993929" elapsed="0.000083"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.993251" elapsed="0.000789"/>
</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-28T22:41:11.994239" elapsed="0.000166"/>
</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-28T22:41:11.994458" elapsed="0.000084"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.994677" 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-28T22:41:11.994595" elapsed="0.000095"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.994795" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:11.994829" 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-28T22:41:11.994741" elapsed="0.000100"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:11.994892" elapsed="0.000106"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.994106" elapsed="0.000921"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:11.991988" elapsed="0.003064"/>
</kw>
<var name="${mark_price_item}">{'s': 'raysol_usdt', 'p': '3.3966', 't': 1747980978061}</var>
<status status="PASS" start="2026-05-28T22:41:11.991927" elapsed="0.003139"/>
</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-28T22:41:11.995297" 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-28T22:41:11.995442" elapsed="0.000093"/>
</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-28T22:41:11.995586" 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-28T22:41:11.995710" 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-28T22:41:11.995974" elapsed="0.000067"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.996152" 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-28T22:41:11.996089" elapsed="0.000083"/>
</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-28T22:41:11.996220" elapsed="0.000073"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.995847" elapsed="0.000474"/>
</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-28T22:41:11.996509" elapsed="0.000071"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.996708" 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-28T22:41:11.996629" elapsed="0.000099"/>
</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-28T22:41:11.996778" elapsed="0.000076"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.997060" 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-28T22:41:11.996923" 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-28T22:41:11.997137" elapsed="0.000096"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.996384" elapsed="0.000881"/>
</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-28T22:41:11.997491" 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-28T22:41:11.997659" elapsed="0.000084"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.997879" 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-28T22:41:11.997796" elapsed="0.000096"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.997997" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:11.998031" 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-28T22:41:11.997943" elapsed="0.000099"/>
</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-28T22:41:11.998094" elapsed="0.000106"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.997346" elapsed="0.000884"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:11.995168" elapsed="0.003087"/>
</kw>
<var name="${mark_price_item}">{'s': 'btx_usdt', 'p': '0.0445', 't': 1776061697756}</var>
<status status="PASS" start="2026-05-28T22:41:11.995107" elapsed="0.003163"/>
</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-28T22:41:11.998516" elapsed="0.000101"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>s</arg>
<arg>标记价格项应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T22:41:11.998669" elapsed="0.000080"/>
</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-28T22:41:11.998800" elapsed="0.000078"/>
</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-28T22:41:11.998929" elapsed="0.000073"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T22:41:11.999290" elapsed="0.000069"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:11.999466" 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-28T22:41:11.999406" elapsed="0.000081"/>
</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-28T22:41:11.999535" elapsed="0.000073"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.999068" elapsed="0.000568"/>
</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-28T22:41:11.999822" elapsed="0.000065"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.000025" level="INFO">Length is 10.</msg>
<arg>${price}</arg>
<arg>标记价格不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T22:41:11.999963" elapsed="0.000082"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T22:41:12.000093" elapsed="0.000076"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.000302" level="INFO">${price_float} = 72962.7684</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-28T22:41:12.000219" elapsed="0.000094"/>
</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-28T22:41:12.000360" elapsed="0.000080"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T22:41:11.999699" elapsed="0.000768"/>
</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-28T22:41:12.000652" elapsed="0.000096"/>
</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-28T22:41:12.000798" elapsed="0.000078"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.001004" level="INFO">${timestamp_str} = 1779979271050</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:12.000926" elapsed="0.000090"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.001115" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:12.001148" 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-28T22:41:12.001064" 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-28T22:41:12.001205" elapsed="0.000100"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:12.000527" elapsed="0.000806"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:11.998386" elapsed="0.002969"/>
</kw>
<var name="${mark_price_item}">{'s': 'btc_usdc', 'p': '72962.7684', 't': 1779979271050}</var>
<status status="PASS" start="2026-05-28T22:41:11.998320" elapsed="0.003048"/>
</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-28T22:41:12.001586" 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-28T22:41:12.001727" elapsed="0.000074"/>
</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-28T22:41:12.001849" elapsed="0.000071"/>
</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-28T22:41:12.001968" elapsed="0.000069"/>
</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-28T22:41:12.002220" elapsed="0.000074"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.002401" 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-28T22:41:12.002340" elapsed="0.000081"/>
</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-28T22:41:12.002467" elapsed="0.000070"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:12.002098" elapsed="0.000466"/>
</kw>
<kw name="验证标记价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T22:41:12.002746" elapsed="0.000065"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.002918" 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-28T22:41:12.002858" elapsed="0.000082"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-05-28T22:41:12.002986" elapsed="0.000072"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.003186" 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-28T22:41:12.003107" elapsed="0.000091"/>
</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-28T22:41:12.003243" elapsed="0.000074"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T22:41:12.002625" elapsed="0.000717"/>
</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-28T22:41:12.004112" elapsed="0.000097"/>
</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-28T22:41:12.004256" elapsed="0.000086"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.004462" 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-28T22:41:12.004389" elapsed="0.000085"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.004613" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:12.004645" 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-28T22:41:12.004559" 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-28T22:41:12.004699" elapsed="0.000092"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:12.003402" elapsed="0.001415"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:12.001465" elapsed="0.003372"/>
</kw>
<var name="${mark_price_item}">{'s': 'xaut_usdt', 'p': '4543.7984', 't': 1779095550280}</var>
<status status="PASS" start="2026-05-28T22:41:12.001408" elapsed="0.003441"/>
</iter>
<var>${mark_price_item}</var>
<value>@{mark_price_list}</value>
<status status="PASS" start="2026-05-28T22:41:11.925357" elapsed="0.079504"/>
</for>
<arg>${data}</arg>
<doc>验证期货标记价格列表的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:11.924791" elapsed="0.080097"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.005364" 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-28T22:41:12.005094" elapsed="0.000281"/>
</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-28T22:41:12.005494" elapsed="0.000206"/>
</kw>
<msg time="2026-05-28T22:41:12.005738" 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-28T22:41:12.005428" elapsed="0.000321"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.005862" 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-28T22:41:12.005800" elapsed="0.000073"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.006003" 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-28T22:41:12.005920" elapsed="0.000094"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.006133" 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-28T22:41:12.006063" elapsed="0.000081"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.006303" 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-28T22:41:12.006191" elapsed="0.000129"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.006452" 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-28T22:41:12.006367" elapsed="0.000096"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.006567" 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-28T22:41:12.006510" elapsed="0.000075"/>
</kw>
<arg>获取期货U本位标记价格</arg>
<arg>/v1/future-u/market/public/q/mark-price</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T22:41:12.004964" elapsed="0.001645"/>
</kw>
<doc>验证期货U本位标记价格接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:11.650890" elapsed="0.355809"/>
</test>
<doc>期货U本位标记价格接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:11.631987" elapsed="0.374969"/>
</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-28T22:41:12.009446" 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-28T22:41:12.009362" elapsed="0.000096"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.009642" 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-28T22:41:12.009586" elapsed="0.000076"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:12.009500" elapsed="0.000176"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:12.009729" elapsed="0.000007"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:12.009687" elapsed="0.000064"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:12.009488" elapsed="0.000270"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.010107" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:12.009978" elapsed="0.000149"/>
</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-28T22:41:12.010221" 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-28T22:41:12.010285" elapsed="0.000009"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:12.010335" 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-28T22:41:12.010382" 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-28T22:41:12.010428" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:12.010154" elapsed="0.000295"/>
</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-28T22:41:12.010521" 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-28T22:41:12.010570" 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-28T22:41:12.010617" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:12.010663" elapsed="0.000007"/>
</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-28T22:41:12.010708" 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-28T22:41:12.010753" 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-28T22:41:12.010797" 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-28T22:41:12.010843" 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-28T22:41:12.010888" elapsed="0.000007"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:12.010458" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.011046" 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-28T22:41:12.010953" elapsed="0.000110"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.011192" 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-28T22:41:12.011106" elapsed="0.000103"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.011338" 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-28T22:41:12.011253" elapsed="0.000102"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.011505" 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-28T22:41:12.011399" elapsed="0.000121"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.011665" 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-28T22:41:12.011574" elapsed="0.000107"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.011817" 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-28T22:41:12.011723" elapsed="0.000111"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.011973" 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-28T22:41:12.011878" elapsed="0.000111"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.012130" 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-28T22:41:12.012037" elapsed="0.000109"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.012280" 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-28T22:41:12.012189" elapsed="0.000107"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:12.010916" elapsed="0.001394"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:12.010148" elapsed="0.002171"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.012424" 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-28T22:41:12.012361" elapsed="0.000081"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:12.012621" 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-28T22:41:12.012485" elapsed="0.000251"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:12.009873" elapsed="0.002891"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.012855" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:12.012805" elapsed="0.000067"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:12.009261" elapsed="0.003633"/>
</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-28T22:41:12.014331" 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-28T22:41:12.014052" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:12.014609" elapsed="0.000010"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:12.014394" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:12.014387" elapsed="0.000257"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:12.014665" elapsed="0.000036"/>
</return>
<msg time="2026-05-28T22:41:12.014774" 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-28T22:41:12.013726" elapsed="0.001059"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:12.270207" 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-28T22:41:12.270536" 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 14:41: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': 'e9064b13cf999d97107cb2258aecffd3', 'X-Transparent': '00-e9064b13cf999d97107cb2258aecffd3-a0e83d2a50b290ab-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': 'a02e04d34cbc8170-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"btc_usdt","p":"73238.32","t":1779979272090},"ts":1779979272255} 
 </msg>
<msg time="2026-05-28T22:41:12.270666" 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-28T22:41:12.270908" 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-28T22:41:12.015137" elapsed="0.255822"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:12.271105" elapsed="0.000078"/>
</return>
<msg time="2026-05-28T22:41:12.271440" 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-28T22:41:12.014847" elapsed="0.256639"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.274069" 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-28T22:41:12.272754" elapsed="0.001441"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.275060" 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-28T22:41:12.274427" elapsed="0.000664"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.275358" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:12.275223" elapsed="0.000174"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:12.271950" elapsed="0.003512"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:12.276238" level="INFO">${response_data} = {'s': 'btc_usdt', 'p': '73238.32', 't': 1779979272090}</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-28T22:41:12.275569" elapsed="0.000702"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.276615" 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-28T22:41:12.276415" elapsed="0.000252"/>
</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-28T22:41:12.277666" elapsed="0.000734"/>
</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-28T22:41:12.279569" elapsed="0.000814"/>
</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-28T22:41:12.280674" elapsed="0.000367"/>
</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-28T22:41:12.281210" elapsed="0.000161"/>
</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-28T22:41:12.281475" elapsed="0.000133"/>
</kw>
<kw name="验证符号标记价格交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-05-28T22:41:12.282246" elapsed="0.000138"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.282626" 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-28T22:41:12.282486" elapsed="0.000183"/>
</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-28T22:41:12.282761" elapsed="0.000143"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-05-28T22:41:12.283201" 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-28T22:41:12.283009" elapsed="0.000223"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-05-28T22:41:12.283461" 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-28T22:41:12.283335" elapsed="0.000149"/>
</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-28T22:41:12.283590" elapsed="0.000217"/>
</kw>
<arg>${mark_price_data}[s]</arg>
<arg>${expected_symbol}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:12.281836" elapsed="0.002049"/>
</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-28T22:41:12.284334" elapsed="0.000120"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.284638" 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-28T22:41:12.284538" elapsed="0.000134"/>
</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-28T22:41:12.284756" elapsed="0.000148"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.285184" level="INFO">${price_float} = 73238.32</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-28T22:41:12.285006" elapsed="0.000202"/>
</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-28T22:41:12.285313" elapsed="0.000226"/>
</kw>
<arg>${mark_price_data}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T22:41:12.284060" elapsed="0.001556"/>
</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-28T22:41:12.286460" elapsed="0.000251"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:12.286801" elapsed="0.000141"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.287189" level="INFO">${timestamp_str} = 1779979272090</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:12.287032" elapsed="0.000179"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.287378" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:12.287434" 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-28T22:41:12.287295" elapsed="0.000157"/>
</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-28T22:41:12.287538" elapsed="0.000203"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-05-28T22:41:12.288027" level="INFO">${current_time} = 1779979272.287954</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-28T22:41:12.287834" elapsed="0.000214"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.288298" level="INFO">${current_timestamp} = 1779979272287</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-28T22:41:12.288140" elapsed="0.000180"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.288576" level="INFO">${time_diff} = 197</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-28T22:41:12.288407" elapsed="0.000191"/>
</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-28T22:41:12.288687" elapsed="0.000143"/>
</kw>
<arg>${mark_price_data}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:12.285932" elapsed="0.003169"/>
</kw>
<arg>${response_data}</arg>
<arg>btc_usdt</arg>
<doc>验证期货单个交易对标记价格的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:12.278762" elapsed="0.010398"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.290911" 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-28T22:41:12.290222" elapsed="0.000717"/>
</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-28T22:41:12.291232" elapsed="0.000614"/>
</kw>
<msg time="2026-05-28T22:41:12.291910" 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-28T22:41:12.291107" elapsed="0.000819"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.292369" 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-28T22:41:12.292228" elapsed="0.000163"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.292635" 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-28T22:41:12.292484" elapsed="0.000169"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.292878" 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-28T22:41:12.292754" elapsed="0.000143"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.293162" 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-28T22:41:12.292974" elapsed="0.000209"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.293554" 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-28T22:41:12.293255" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.293731" 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-28T22:41:12.293646" elapsed="0.000113"/>
</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-28T22:41:12.289407" elapsed="0.004394"/>
</kw>
<doc>验证期货U本位单个交易对标记价格接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:12.012921" elapsed="0.280978"/>
</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-28T22:41:12.296280" 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-28T22:41:12.295797" elapsed="0.000507"/>
</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-28T22:41:12.296943" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:12.296401" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:12.296383" elapsed="0.000640"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:12.297100" elapsed="0.000131"/>
</return>
<msg time="2026-05-28T22:41:12.297486" 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-28T22:41:12.295255" elapsed="0.002253"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:12.416816" 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-28T22:41:12.417082" 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 14:41: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': '2efe9fe069df0bf69c29d9509653b86e', 'X-Transparent': '00-2efe9fe069df0bf69c29d9509653b86e-e2ffb494cca9d86c-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': 'a02e04d4382d8170-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"eth_usdt","p":"76000","t":1779979272103},"ts":1779979272402} 
 </msg>
<msg time="2026-05-28T22:41:12.417179" 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-28T22:41:12.417356" 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-28T22:41:12.298478" elapsed="0.118906"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:12.417486" elapsed="0.000062"/>
</return>
<msg time="2026-05-28T22:41:12.417727" 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-28T22:41:12.297792" elapsed="0.119958"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.418976" 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-28T22:41:12.418432" elapsed="0.000610"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.419583" 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-28T22:41:12.419172" elapsed="0.000433"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.419814" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:12.419706" elapsed="0.000147"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:12.418019" elapsed="0.001975"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:12.421298" level="INFO">${response_data} = {'s': 'eth_usdt', 'p': '76000', 't': 1779979272103}</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-28T22:41:12.420240" elapsed="0.001093"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.421624" 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-28T22:41:12.421463" elapsed="0.000208"/>
</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-28T22:41:12.421800" elapsed="0.000266"/>
</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-28T22:41:12.422756" elapsed="0.000412"/>
</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-28T22:41:12.423266" elapsed="0.000139"/>
</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-28T22:41:12.423491" elapsed="0.000128"/>
</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-28T22:41:12.423707" elapsed="0.000160"/>
</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-28T22:41:12.424865" elapsed="0.000139"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.425443" 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-28T22:41:12.425090" elapsed="0.000395"/>
</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-28T22:41:12.425596" elapsed="0.000166"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-05-28T22:41:12.426003" 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-28T22:41:12.425868" elapsed="0.000157"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-05-28T22:41:12.426230" 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-28T22:41:12.426110" elapsed="0.000222"/>
</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-28T22:41:12.426429" elapsed="0.000197"/>
</kw>
<arg>${mark_price_data}[s]</arg>
<arg>${expected_symbol}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:12.424186" elapsed="0.002507"/>
</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-28T22:41:12.427126" elapsed="0.000119"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.427438" 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-28T22:41:12.427332" elapsed="0.000141"/>
</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-28T22:41:12.427590" elapsed="0.000256"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.428372" 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-28T22:41:12.428029" elapsed="0.000384"/>
</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-28T22:41:12.428579" elapsed="0.000321"/>
</kw>
<arg>${mark_price_data}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-05-28T22:41:12.426859" elapsed="0.002213"/>
</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-28T22:41:12.430073" elapsed="0.000274"/>
</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-28T22:41:12.430450" elapsed="0.000164"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.430936" level="INFO">${timestamp_str} = 1779979272103</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:12.430754" elapsed="0.000215"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.431279" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:12.431365" 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-28T22:41:12.431109" elapsed="0.000277"/>
</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-28T22:41:12.431487" elapsed="0.000413"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-05-28T22:41:12.432329" level="INFO">${current_time} = 1779979272.432234</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-28T22:41:12.432056" elapsed="0.000310"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.432761" level="INFO">${current_timestamp} = 1779979272432</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-28T22:41:12.432509" elapsed="0.000285"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.433194" level="INFO">${time_diff} = 329</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-28T22:41:12.432928" elapsed="0.000289"/>
</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-28T22:41:12.433317" elapsed="0.000146"/>
</kw>
<arg>${mark_price_data}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:12.429487" elapsed="0.004044"/>
</kw>
<arg>${response_data}</arg>
<arg>eth_usdt</arg>
<doc>验证期货单个交易对标记价格的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:12.422336" elapsed="0.011246"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.434605" 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-28T22:41:12.434130" elapsed="0.000506"/>
</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-28T22:41:12.434897" elapsed="0.000466"/>
</kw>
<msg time="2026-05-28T22:41:12.435458" 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-28T22:41:12.434769" elapsed="0.000713"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.435794" 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-28T22:41:12.435620" elapsed="0.000201"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.436179" 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-28T22:41:12.435950" elapsed="0.000258"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.436483" 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-28T22:41:12.436331" elapsed="0.000174"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.436843" 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-28T22:41:12.436601" elapsed="0.000337"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.437226" 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-28T22:41:12.437036" elapsed="0.000214"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.437497" 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-28T22:41:12.437357" elapsed="0.000193"/>
</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-28T22:41:12.433777" elapsed="0.003856"/>
</kw>
<doc>验证期货U本位ETH交易对标记价格接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:12.294131" elapsed="0.143682"/>
</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-28T22:41:12.442017" 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-28T22:41:12.441356" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:12.442750" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:12.442200" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:12.442174" elapsed="0.000660"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:12.442870" elapsed="0.000037"/>
</return>
<msg time="2026-05-28T22:41:12.443092" 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-28T22:41:12.440431" elapsed="0.002685"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:12.645126" 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-28T22:41:12.645291" 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 14:41: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': 'e6fd0f39a0db5b0342910ae9ee3db9e6', 'X-Transparent': '00-e6fd0f39a0db5b0342910ae9ee3db9e6-24b9173caa2bbc3d-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': 'a02e04d59dbd8170-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1779979272632} 
 </msg>
<msg time="2026-05-28T22:41:12.645363" 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-28T22:41:12.645534" 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-28T22:41:12.444130" elapsed="0.201434"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:12.645744" elapsed="0.000101"/>
</return>
<msg time="2026-05-28T22:41:12.646238" 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-28T22:41:12.443286" elapsed="0.203006"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.647816" 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-28T22:41:12.646630" elapsed="0.001355"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:12.649347" 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-28T22:41:12.648212" elapsed="0.001187"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:12.650192" 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-28T22:41:12.649601" elapsed="0.000617"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:12.650817" 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-28T22:41:12.650337" elapsed="0.000506"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.651178" 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-28T22:41:12.650962" elapsed="0.000275"/>
</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-28T22:41:12.651353" elapsed="0.000171"/>
</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-28T22:41:12.651647" elapsed="0.000250"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.653406" 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-28T22:41:12.652774" elapsed="0.000659"/>
</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-28T22:41:12.653681" elapsed="0.000593"/>
</kw>
<msg time="2026-05-28T22:41:12.654457" 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-28T22:41:12.653543" elapsed="0.000968"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.654973" 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-28T22:41:12.654758" elapsed="0.000239"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.655297" 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-28T22:41:12.655100" elapsed="0.000222"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.655668" 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-28T22:41:12.655456" elapsed="0.000244"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.656460" 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-28T22:41:12.655928" elapsed="0.000595"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.657063" 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-28T22:41:12.656764" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.657388" 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-28T22:41:12.657236" elapsed="0.000199"/>
</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-28T22:41:12.652283" elapsed="0.005237"/>
</kw>
<doc>验证期货U本位标记价格接口对无效交易对的处理</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:12.438069" elapsed="0.219635"/>
</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-28T22:41:12.662114" 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-28T22:41:12.661236" elapsed="0.000938"/>
</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-28T22:41:12.663453" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:12.662518" elapsed="0.001039"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:12.662480" elapsed="0.001110"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:12.663665" elapsed="0.000050"/>
</return>
<msg time="2026-05-28T22:41:12.664094" 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-28T22:41:12.660318" elapsed="0.003814"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:12.780627" 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-28T22:41:12.780835" 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 14:41: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': 'b39b36bf280184c2e4990a091639cbb9', 'X-Transparent': '00-b39b36bf280184c2e4990a091639cbb9-845d7a0c50d5b9b0-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': 'a02e04d689548170-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1779979272767} 
 </msg>
<msg time="2026-05-28T22:41:12.780933" 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-28T22:41:12.781176" 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-28T22:41:12.665587" elapsed="0.115619"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:12.781341" elapsed="0.000066"/>
</return>
<msg time="2026-05-28T22:41:12.781665" 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-28T22:41:12.664424" elapsed="0.117304"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.782590" 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-28T22:41:12.781995" elapsed="0.000653"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:12.783207" 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-28T22:41:12.782763" elapsed="0.000476"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:12.784339" 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-28T22:41:12.783485" elapsed="0.000890"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:12.785230" 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-28T22:41:12.784540" elapsed="0.000716"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.786086" 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-28T22:41:12.785374" elapsed="0.000766"/>
</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-28T22:41:12.786257" elapsed="0.000149"/>
</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-28T22:41:12.786513" elapsed="0.000199"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.789438" 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-28T22:41:12.787412" elapsed="0.002321"/>
</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-28T22:41:12.790536" elapsed="0.000650"/>
</kw>
<msg time="2026-05-28T22:41:12.791292" 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-28T22:41:12.790105" elapsed="0.001212"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.791709" 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-28T22:41:12.791535" elapsed="0.000199"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.792029" 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-28T22:41:12.791839" elapsed="0.000212"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.792326" 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-28T22:41:12.792168" elapsed="0.000182"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.792770" 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-28T22:41:12.792502" elapsed="0.000295"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.793155" 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-28T22:41:12.792896" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.793497" 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-28T22:41:12.793334" elapsed="0.000211"/>
</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-28T22:41:12.786939" elapsed="0.006689"/>
</kw>
<doc>验证期货U本位标记价格接口对缺少参数的处理</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:12.658073" elapsed="0.135743"/>
</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-28T22:41:12.799243" 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-28T22:41:12.798571" elapsed="0.000705"/>
</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-28T22:41:12.799881" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:12.799405" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:12.799384" elapsed="0.000581"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:12.799996" elapsed="0.000028"/>
</return>
<msg time="2026-05-28T22:41:12.800179" 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-28T22:41:12.797361" elapsed="0.002839"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:12.923396" 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-28T22:41:12.923870" 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 14:41:12 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9995', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '7684197324e9b81c73b5e511c120aa1b', 'X-Transparent': '00-7684197324e9b81c73b5e511c120aa1b-45b1fcc3bac9a063-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': 'a02e04d75c9c8170-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1779979272910} 
 </msg>
<msg time="2026-05-28T22:41:12.924074" 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-28T22:41:12.924330" 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-28T22:41:12.801353" elapsed="0.123012"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:12.924499" elapsed="0.000073"/>
</return>
<msg time="2026-05-28T22:41:12.924759" 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-28T22:41:12.800402" elapsed="0.124385"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.925731" 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-28T22:41:12.924985" elapsed="0.000865"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:12.927273" 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-28T22:41:12.926065" elapsed="0.001274"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:12.928641" 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-28T22:41:12.927596" elapsed="0.001077"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:12.929381" 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-28T22:41:12.928802" elapsed="0.000621"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.930034" 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-28T22:41:12.929678" elapsed="0.000433"/>
</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-28T22:41:12.930281" elapsed="0.000295"/>
</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-28T22:41:12.930762" elapsed="0.000297"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.932658" 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-28T22:41:12.931919" elapsed="0.000792"/>
</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-28T22:41:12.933521" elapsed="0.000579"/>
</kw>
<msg time="2026-05-28T22:41:12.934206" 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-28T22:41:12.933003" elapsed="0.001227"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.934544" 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-28T22:41:12.934392" elapsed="0.000175"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.934870" 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-28T22:41:12.934669" elapsed="0.000224"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.935136" 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-28T22:41:12.934996" elapsed="0.000162"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.935516" 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-28T22:41:12.935268" elapsed="0.000276"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.935826" 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-28T22:41:12.935646" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.936268" 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-28T22:41:12.936114" elapsed="0.000200"/>
</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-28T22:41:12.931363" elapsed="0.005030"/>
</kw>
<doc>验证期货U本位标记价格接口对大写交易对的处理（应返回错误）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:12.794165" elapsed="0.142407"/>
</test>
<doc>期货U本位单个交易对标记价格接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:12.007453" elapsed="0.929540"/>
</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-28T22:41:12.944041" 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-28T22:41:12.943786" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.944688" 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-28T22:41:12.944460" elapsed="0.000308"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:12.944203" elapsed="0.000620"/>
</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-28T22:41:12.945007" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:12.944859" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:12.944174" elapsed="0.000929"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.946037" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:12.945894" 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-28T22:41:12.946325" 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-28T22:41:12.946443" 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-28T22:41:12.946551" 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-28T22:41:12.946814" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:12.946928" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:12.946151" elapsed="0.000825"/>
</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-28T22:41:12.947155" 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-28T22:41:12.947262" 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-28T22:41:12.947371" 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-28T22:41:12.947474" 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-28T22:41:12.947577" 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-28T22:41:12.947680" 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-28T22:41:12.947780" 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-28T22:41:12.947881" 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-28T22:41:12.947981" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:12.946999" elapsed="0.001026"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.948352" 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-28T22:41:12.948129" elapsed="0.000265"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.948689" 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-28T22:41:12.948492" elapsed="0.000235"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.949014" 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-28T22:41:12.948823" elapsed="0.000227"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.949395" 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-28T22:41:12.949193" elapsed="0.000240"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.949726" 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-28T22:41:12.949532" elapsed="0.000232"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.950059" 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-28T22:41:12.949863" elapsed="0.000233"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.950401" 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-28T22:41:12.950195" elapsed="0.000244"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.950745" 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-28T22:41:12.950538" elapsed="0.000244"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.951084" 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-28T22:41:12.950881" elapsed="0.000239"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:12.948045" elapsed="0.003108"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:12.946133" elapsed="0.005039"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.951406" 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-28T22:41:12.951259" elapsed="0.000189"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:12.951841" 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-28T22:41:12.951544" elapsed="0.000494"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:12.945467" elapsed="0.006639"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:12.952289" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:12.952204" elapsed="0.000124"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:12.943423" elapsed="0.008952"/>
</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-28T22:41:12.955839" 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-28T22:41:12.955117" 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-28T22:41:12.956538" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:12.955988" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:12.955969" elapsed="0.000650"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:12.956658" elapsed="0.000039"/>
</return>
<msg time="2026-05-28T22:41:12.956862" 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-28T22:41:12.954107" elapsed="0.002779"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:13.296341" 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-28T22:41:13.296542" 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 14:41: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': '37ec51e3ae73ca66420c1a0258591cfc', 'X-Transparent': '00-37ec51e3ae73ca66420c1a0258591cfc-6b5b41f7b0e62ba4-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': 'a02e04d9aa51e2fd-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1779979132288,"s":"btc_usdt","c":"73416.50","h":"78844.40","l":"72608.80","a":"230622","v":"1712083","o":"75399.80","r":"-0.0263"},"ts":1779979273277} 
 </msg>
<msg time="2026-05-28T22:41:13.296722" 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-28T22:41:13.297005" 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-28T22:41:12.957365" elapsed="0.339698"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:13.297177" elapsed="0.000073"/>
</return>
<msg time="2026-05-28T22:41:13.297534" 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-28T22:41:12.957027" elapsed="0.340551"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.299219" 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-28T22:41:13.298618" elapsed="0.000687"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.299958" 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-28T22:41:13.299475" elapsed="0.000506"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.300194" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:13.300084" elapsed="0.000147"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:13.297918" elapsed="0.002416"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.301588" 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-28T22:41:13.300576" elapsed="0.001111"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.303006" level="INFO">${ticker_data} = {'t': 1779979132288, 's': 'btc_usdt', 'c': '73416.50', 'h': '78844.40', 'l': '72608.80', 'a': '230622', 'v': '1712083', 'o': '75399.80', 'r': '-0.0263'}</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-28T22:41:13.301921" elapsed="0.001145"/>
</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-28T22:41:13.304065" elapsed="0.000471"/>
</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-28T22:41:13.304665" elapsed="0.000117"/>
</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-28T22:41:13.304867" elapsed="0.000118"/>
</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-28T22:41:13.305070" elapsed="0.000098"/>
</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-28T22:41:13.305278" elapsed="0.000110"/>
</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-28T22:41:13.305479" elapsed="0.000101"/>
</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-28T22:41:13.305658" elapsed="0.000096"/>
</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-28T22:41:13.305834" 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-28T22:41:13.306007" elapsed="0.000100"/>
</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-28T22:41:13.307219" elapsed="0.000334"/>
</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-28T22:41:13.307676" elapsed="0.000138"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.308064" level="INFO">${timestamp_str} = 1779979132288</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:13.307903" elapsed="0.000187"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.308275" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:13.308341" 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-28T22:41:13.308181" elapsed="0.000181"/>
</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-28T22:41:13.308446" elapsed="0.000213"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证单个Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.306305" elapsed="0.002493"/>
</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-28T22:41:13.310020" elapsed="0.000174"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.310417" 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-28T22:41:13.310304" elapsed="0.000154"/>
</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-28T22:41:13.310548" elapsed="0.000111"/>
</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-28T22:41:13.310746" elapsed="0.000108"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证单个Ticker交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.309149" elapsed="0.001775"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.312477" 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-28T22:41:13.312135" elapsed="0.000398"/>
</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-28T22:41:13.312697" elapsed="0.000810"/>
</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-28T22:41:13.314161" elapsed="0.001013"/>
</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-28T22:41:13.315779" elapsed="0.000127"/>
</kw>
<msg time="2026-05-28T22:41:13.316021" level="INFO">${price_float} = 73416.50</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-28T22:41:13.315470" elapsed="0.000576"/>
</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-28T22:41:13.316152" elapsed="0.000348"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.311181" elapsed="0.005395"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.318021" 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-28T22:41:13.317761" elapsed="0.000299"/>
</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-28T22:41:13.318232" elapsed="0.000307"/>
</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-28T22:41:13.318701" elapsed="0.000142"/>
</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-28T22:41:13.319125" elapsed="0.000108"/>
</kw>
<msg time="2026-05-28T22:41:13.319318" 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-28T22:41:13.318950" elapsed="0.000392"/>
</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-28T22:41:13.319449" elapsed="0.000253"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.316794" elapsed="0.002978"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.321140" 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-28T22:41:13.320953" elapsed="0.000214"/>
</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-28T22:41:13.321255" 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-28T22:41:13.321537" elapsed="0.000193"/>
</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-28T22:41:13.322120" elapsed="0.000160"/>
</kw>
<msg time="2026-05-28T22:41:13.322388" 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-28T22:41:13.321863" elapsed="0.000625"/>
</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-28T22:41:13.322756" elapsed="0.000652"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.319965" elapsed="0.003591"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.325233" 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-28T22:41:13.324967" elapsed="0.000302"/>
</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-28T22:41:13.325409" elapsed="0.000276"/>
</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-28T22:41:13.325827" elapsed="0.000158"/>
</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-28T22:41:13.326355" elapsed="0.000142"/>
</kw>
<msg time="2026-05-28T22:41:13.326594" level="INFO">${price_float} = 75399.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-28T22:41:13.326124" elapsed="0.000498"/>
</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-28T22:41:13.326755" elapsed="0.000289"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.323811" elapsed="0.003309"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.328125" 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-28T22:41:13.327943" elapsed="0.000208"/>
</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-28T22:41:13.328248" elapsed="0.000196"/>
</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-28T22:41:13.328568" elapsed="0.000144"/>
</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-28T22:41:13.329009" elapsed="0.000117"/>
</kw>
<msg time="2026-05-28T22:41:13.329207" level="INFO">${amount_float} = 230622</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-28T22:41:13.328823" elapsed="0.000410"/>
</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-28T22:41:13.329419" elapsed="0.000431"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.327303" elapsed="0.002629"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.331009" 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-28T22:41:13.330800" elapsed="0.000238"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:13.331149" elapsed="0.000215"/>
</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-28T22:41:13.331484" elapsed="0.000130"/>
</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-28T22:41:13.331929" elapsed="0.000120"/>
</kw>
<msg time="2026-05-28T22:41:13.332126" level="INFO">${amount_float} = 1712083</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-28T22:41:13.331733" elapsed="0.000418"/>
</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-28T22:41:13.332263" elapsed="0.000245"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.330104" elapsed="0.002463"/>
</kw>
<kw name="验证单个Ticker涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.333493" 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-28T22:41:13.333309" elapsed="0.000210"/>
</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-28T22:41:13.333618" elapsed="0.000170"/>
</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-28T22:41:13.333899" 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-28T22:41:13.334330" elapsed="0.000115"/>
</kw>
<msg time="2026-05-28T22:41:13.334520" level="INFO">${rate_float} = -0.0263</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-28T22:41:13.334139" elapsed="0.000405"/>
</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-28T22:41:13.334720" elapsed="0.000251"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证单个Ticker涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.332713" elapsed="0.002318"/>
</kw>
<arg>${ticker_data}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.303613" elapsed="0.031470"/>
</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-28T22:41:13.335193" elapsed="0.000451"/>
</kw>
<doc>验证期货U本位单个Ticker接口功能（BTC交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:12.952444" elapsed="0.383351"/>
</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-28T22:41:13.339028" 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-28T22:41:13.338331" elapsed="0.000734"/>
</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-28T22:41:13.339778" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:13.339221" elapsed="0.000618"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:13.339190" elapsed="0.000671"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:13.339894" elapsed="0.000040"/>
</return>
<msg time="2026-05-28T22:41:13.340096" 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-28T22:41:13.337446" elapsed="0.002675"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:13.455617" 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-28T22:41:13.455929" 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 14:41: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': 'aa177cecd3ee819d21442d84ba35f53b', 'X-Transparent': '00-aa177cecd3ee819d21442d84ba35f53b-339871c517afa1ed-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': 'a02e04dabd52e2fd-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":1779979273446} 
 </msg>
<msg time="2026-05-28T22:41:13.456039" 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-28T22:41:13.456273" 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-28T22:41:13.340795" elapsed="0.115517"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:13.456424" elapsed="0.000080"/>
</return>
<msg time="2026-05-28T22:41:13.456742" 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-28T22:41:13.340272" elapsed="0.116498"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.457952" 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-28T22:41:13.457453" elapsed="0.000563"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.458543" 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-28T22:41:13.458124" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.458789" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:13.458679" elapsed="0.000153"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:13.457067" elapsed="0.001959"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.459673" 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-28T22:41:13.459143" elapsed="0.000583"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.460322" 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-28T22:41:13.459852" elapsed="0.000498"/>
</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-28T22:41:13.461000" elapsed="0.000180"/>
</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-28T22:41:13.461299" elapsed="0.000115"/>
</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-28T22:41:13.461503" 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-28T22:41:13.461694" elapsed="0.000101"/>
</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-28T22:41:13.461880" 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-28T22:41:13.462060" elapsed="0.000101"/>
</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-28T22:41:13.462240" elapsed="0.000118"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T22:41:13.462679" elapsed="0.000543"/>
</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-28T22:41:13.463826" elapsed="0.000528"/>
</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-28T22:41:13.465881" elapsed="0.000359"/>
</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-28T22:41:13.466382" elapsed="0.000242"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.466913" 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-28T22:41:13.466725" elapsed="0.000214"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.467148" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:13.467223" 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-28T22:41:13.467045" elapsed="0.000198"/>
</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-28T22:41:13.467361" elapsed="0.002745"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证单个Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.464761" elapsed="0.005473"/>
</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-28T22:41:13.471659" elapsed="0.000272"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.472297" 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-28T22:41:13.472101" elapsed="0.000267"/>
</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-28T22:41:13.472661" elapsed="0.000394"/>
</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-28T22:41:13.473244" elapsed="0.000205"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证单个Ticker交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.470550" elapsed="0.003005"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.475394" 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-28T22:41:13.475035" elapsed="0.000399"/>
</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-28T22:41:13.475571" elapsed="0.000293"/>
</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-28T22:41:13.476002" elapsed="0.000129"/>
</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-28T22:41:13.476420" elapsed="0.000113"/>
</kw>
<msg time="2026-05-28T22:41:13.476614" 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-28T22:41:13.476234" elapsed="0.000404"/>
</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-28T22:41:13.476741" elapsed="0.000269"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.473840" elapsed="0.003244"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.479279" 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-28T22:41:13.478873" elapsed="0.000445"/>
</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-28T22:41:13.479469" 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-28T22:41:13.479815" elapsed="0.000135"/>
</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-28T22:41:13.480278" elapsed="0.000128"/>
</kw>
<msg time="2026-05-28T22:41:13.480496" 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-28T22:41:13.480066" elapsed="0.000451"/>
</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-28T22:41:13.480618" elapsed="0.000262"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.477586" elapsed="0.003357"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.481905" 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-28T22:41:13.481754" elapsed="0.000173"/>
</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-28T22:41:13.482010" 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-28T22:41:13.482267" elapsed="0.000106"/>
</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-28T22:41:13.482633" elapsed="0.000094"/>
</kw>
<msg time="2026-05-28T22:41:13.482795" 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-28T22:41:13.482470" elapsed="0.000344"/>
</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-28T22:41:13.482918" elapsed="0.000216"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.481114" elapsed="0.002078"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.484188" 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-28T22:41:13.483998" elapsed="0.000216"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:13.484307" elapsed="0.000178"/>
</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-28T22:41:13.484584" elapsed="0.000108"/>
</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-28T22:41:13.484955" elapsed="0.000102"/>
</kw>
<msg time="2026-05-28T22:41:13.485128" 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-28T22:41:13.484788" elapsed="0.000361"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt;= 0</arg>
<arg>${field_name}应该大于等于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:13.485330" elapsed="0.000500"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.483356" elapsed="0.002598"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.487458" 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-28T22:41:13.487125" elapsed="0.000373"/>
</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-28T22:41:13.487640" elapsed="0.000612"/>
</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-28T22:41:13.488393" elapsed="0.000157"/>
</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-28T22:41:13.488918" elapsed="0.000136"/>
</kw>
<msg time="2026-05-28T22:41:13.489151" 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-28T22:41:13.488687" elapsed="0.000558"/>
</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-28T22:41:13.489364" elapsed="0.000239"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.486198" elapsed="0.003463"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.490577" 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-28T22:41:13.490396" elapsed="0.000206"/>
</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-28T22:41:13.490699" elapsed="0.000191"/>
</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-28T22:41:13.490996" elapsed="0.000122"/>
</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-28T22:41:13.491414" elapsed="0.000113"/>
</kw>
<msg time="2026-05-28T22:41:13.491600" 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-28T22:41:13.491230" elapsed="0.000392"/>
</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-28T22:41:13.491731" elapsed="0.000234"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.489802" elapsed="0.002220"/>
</kw>
<kw name="验证单个Ticker涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.492888" 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-28T22:41:13.492715" elapsed="0.000197"/>
</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-28T22:41:13.493009" elapsed="0.000163"/>
</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-28T22:41:13.493284" elapsed="0.000122"/>
</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-28T22:41:13.493695" elapsed="0.000111"/>
</kw>
<msg time="2026-05-28T22:41:13.493878" 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-28T22:41:13.493517" elapsed="0.000383"/>
</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-28T22:41:13.494008" elapsed="0.000244"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证单个Ticker涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.492154" elapsed="0.002156"/>
</kw>
<arg>${ticker_data}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.460653" elapsed="0.033707"/>
</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-28T22:41:13.494472" elapsed="0.000518"/>
</kw>
<doc>验证期货U本位单个Ticker接口功能（ETH交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:13.336132" elapsed="0.159046"/>
</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-28T22:41:13.498040" 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-28T22:41:13.497498" elapsed="0.000567"/>
</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-28T22:41:13.498596" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:13.498177" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:13.498154" elapsed="0.000510"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:13.498698" elapsed="0.000047"/>
</return>
<msg time="2026-05-28T22:41:13.498884" 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-28T22:41:13.496855" elapsed="0.002050"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:13.683285" 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-28T22:41:13.683623" 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 14:41: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': 'b1bad94531c1d6f1d942a5154891e8c8', 'X-Transparent': '00-b1bad94531c1d6f1d942a5154891e8c8-b47abe48381c8a0c-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': 'a02e04dc29f7e2fd-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":1779979273673} 
 </msg>
<msg time="2026-05-28T22:41:13.683733" 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-28T22:41:13.683961" 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-28T22:41:13.499346" elapsed="0.184651"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:13.684095" elapsed="0.000051"/>
</return>
<msg time="2026-05-28T22:41:13.684321" 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-28T22:41:13.499047" elapsed="0.185306"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.685566" 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-28T22:41:13.684972" elapsed="0.000667"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.686438" 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-28T22:41:13.685781" elapsed="0.000689"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.686780" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:13.686614" elapsed="0.000217"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:13.684592" elapsed="0.002306"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.687534" 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-28T22:41:13.687021" elapsed="0.000565"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.688421" 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-28T22:41:13.687707" elapsed="0.000791"/>
</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-28T22:41:13.689602" elapsed="0.000160"/>
</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-28T22:41:13.689870" elapsed="0.000129"/>
</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-28T22:41:13.690097" elapsed="0.000137"/>
</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-28T22:41:13.690328" elapsed="0.000120"/>
</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-28T22:41:13.690542" elapsed="0.000122"/>
</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-28T22:41:13.690758" 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-28T22:41:13.690973" 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-28T22:41:13.691182" elapsed="0.000119"/>
</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-28T22:41:13.691393" elapsed="0.000121"/>
</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-28T22:41:13.692268" elapsed="0.000216"/>
</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-28T22:41:13.692585" elapsed="0.000165"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.693082" 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-28T22:41:13.692912" elapsed="0.000194"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.693306" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:13.693374" 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-28T22:41:13.693204" elapsed="0.000192"/>
</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-28T22:41:13.693490" elapsed="0.000222"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证单个Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.691679" elapsed="0.002091"/>
</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-28T22:41:13.694447" elapsed="0.000124"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.694769" 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-28T22:41:13.694667" elapsed="0.000143"/>
</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-28T22:41:13.694903" elapsed="0.000121"/>
</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-28T22:41:13.695121" elapsed="0.000127"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证单个Ticker交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.693895" elapsed="0.001408"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.696168" 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-28T22:41:13.695987" elapsed="0.000212"/>
</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-28T22:41:13.696294" 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-28T22:41:13.696614" elapsed="0.000133"/>
</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-28T22:41:13.697045" elapsed="0.000100"/>
</kw>
<msg time="2026-05-28T22:41:13.697208" 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-28T22:41:13.696858" elapsed="0.000369"/>
</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-28T22:41:13.697316" elapsed="0.000202"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.695428" elapsed="0.002139"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.698292" 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-28T22:41:13.698147" elapsed="0.000166"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:13.698396" 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-28T22:41:13.698649" elapsed="0.000103"/>
</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-28T22:41:13.698995" elapsed="0.000205"/>
</kw>
<msg time="2026-05-28T22:41:13.699264" 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-28T22:41:13.698844" elapsed="0.000440"/>
</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-28T22:41:13.699376" elapsed="0.000197"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.697678" elapsed="0.001944"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.700356" 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-28T22:41:13.700210" 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-28T22:41:13.700459" 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-28T22:41:13.700715" elapsed="0.000105"/>
</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-28T22:41:13.701065" elapsed="0.000095"/>
</kw>
<msg time="2026-05-28T22:41:13.701253" 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-28T22:41:13.700913" elapsed="0.000360"/>
</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-28T22:41:13.701364" elapsed="0.000196"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.699732" elapsed="0.001876"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.702328" 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-28T22:41:13.702184" 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-28T22:41:13.702430" 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-28T22:41:13.702679" elapsed="0.000102"/>
</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-28T22:41:13.703029" elapsed="0.000094"/>
</kw>
<msg time="2026-05-28T22:41:13.703184" 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-28T22:41:13.702877" elapsed="0.000326"/>
</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-28T22:41:13.703298" elapsed="0.000223"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.701715" elapsed="0.001854"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.704308" 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-28T22:41:13.704160" elapsed="0.000169"/>
</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-28T22:41:13.704411" elapsed="0.000160"/>
</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-28T22:41:13.704660" elapsed="0.000102"/>
</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-28T22:41:13.704982" elapsed="0.000084"/>
</kw>
<msg time="2026-05-28T22:41:13.705121" 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-28T22:41:13.704843" elapsed="0.000296"/>
</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-28T22:41:13.705221" elapsed="0.000171"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.703681" elapsed="0.001752"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.706071" 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-28T22:41:13.705942" 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-28T22:41:13.706161" elapsed="0.000140"/>
</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-28T22:41:13.706381" elapsed="0.000089"/>
</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-28T22:41:13.706690" elapsed="0.000084"/>
</kw>
<msg time="2026-05-28T22:41:13.706830" 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-28T22:41:13.706555" elapsed="0.000292"/>
</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-28T22:41:13.706927" elapsed="0.000170"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.705528" elapsed="0.001611"/>
</kw>
<kw name="验证单个Ticker涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.707784" 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-28T22:41:13.707648" elapsed="0.000154"/>
</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-28T22:41:13.707874" elapsed="0.000120"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T22:41:13.708102" elapsed="0.000093"/>
</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-28T22:41:13.708414" elapsed="0.000085"/>
</kw>
<msg time="2026-05-28T22:41:13.708553" 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-28T22:41:13.708279" elapsed="0.000291"/>
</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-28T22:41:13.708653" elapsed="0.000166"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证单个Ticker涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.707235" elapsed="0.001623"/>
</kw>
<arg>${ticker_data}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T22:41:13.688933" elapsed="0.019958"/>
</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-28T22:41:13.708975" elapsed="0.000318"/>
</kw>
<doc>验证期货U本位单个Ticker接口功能（SOL交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:13.495431" elapsed="0.213965"/>
</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-28T22:41:13.711811" 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-28T22:41:13.711350" elapsed="0.000482"/>
</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-28T22:41:13.712251" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:13.711920" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:13.711903" elapsed="0.000402"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:13.712327" elapsed="0.000023"/>
</return>
<msg time="2026-05-28T22:41:13.712458" 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-28T22:41:13.710735" elapsed="0.001740"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:13.827150" 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-28T22:41:13.827420" 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 14:41: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': 'e6d3cdc5585a5e022b1f7d25f1f885bb', 'X-Transparent': '00-e6d3cdc5585a5e022b1f7d25f1f885bb-ba031d50958d3070-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': 'a02e04dd0c7fe2fd-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1779979273817} 
 </msg>
<msg time="2026-05-28T22:41:13.827555" 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-28T22:41:13.827869" 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-28T22:41:13.712798" elapsed="0.115110"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:13.828060" elapsed="0.000099"/>
</return>
<msg time="2026-05-28T22:41:13.828505" 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-28T22:41:13.712563" elapsed="0.115973"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.831057" 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-28T22:41:13.828916" elapsed="0.002417"/>
</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-28T22:41:13.831833" elapsed="0.000882"/>
</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-28T22:41:13.833072" elapsed="0.000797"/>
</kw>
<doc>验证期货U本位单个Ticker接口对无效交易对的处理</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:13.709555" elapsed="0.124494"/>
</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-28T22:41:13.838508" 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-28T22:41:13.837422" elapsed="0.001133"/>
</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-28T22:41:13.839520" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:13.838733" elapsed="0.000883"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:13.838699" elapsed="0.000948"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:13.839696" elapsed="0.000049"/>
</return>
<msg time="2026-05-28T22:41:13.840034" 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-28T22:41:13.836380" elapsed="0.003690"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:13.954197" 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-28T22:41:13.954579" 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 14:41:13 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9995', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'e28aadf494c451424bddf255e968668e', 'X-Transparent': '00-e28aadf494c451424bddf255e968668e-a4aaee6d67b2b485-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': 'a02e04dddeefe2fd-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1779979273944} 
 </msg>
<msg time="2026-05-28T22:41:13.954748" 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-28T22:41:13.955037" 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-28T22:41:13.842034" elapsed="0.113031"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:13.955174" elapsed="0.000070"/>
</return>
<msg time="2026-05-28T22:41:13.955449" 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-28T22:41:13.840562" elapsed="0.114918"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.956761" 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-28T22:41:13.955792" elapsed="0.001102"/>
</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-28T22:41:13.957158" elapsed="0.000776"/>
</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-28T22:41:13.958386" elapsed="0.000723"/>
</kw>
<doc>验证期货U本位单个Ticker接口对缺少symbol参数的处理</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:13.834337" elapsed="0.125003"/>
</test>
<doc>期货U本位单个Ticker接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:12.938934" elapsed="1.020876"/>
</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-28T22:41:13.970469" 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-28T22:41:13.970202" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.971022" 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-28T22:41:13.970858" elapsed="0.000228"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:13.970621" elapsed="0.000512"/>
</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-28T22:41:13.971266" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:13.971163" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:13.970593" elapsed="0.000739"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.972760" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:13.972402" elapsed="0.000468"/>
</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-28T22:41:13.973402" elapsed="0.000030"/>
</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-28T22:41:13.973531" 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-28T22:41:13.973631" 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-28T22:41:13.973726" 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-28T22:41:13.973821" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:13.973031" elapsed="0.000834"/>
</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-28T22:41:13.974041" 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-28T22:41:13.974158" 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-28T22:41:13.974266" 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-28T22:41:13.974370" 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-28T22:41:13.974474" 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-28T22:41:13.974580" 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-28T22:41:13.974688" 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-28T22:41:13.974801" 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-28T22:41:13.974917" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:13.973893" elapsed="0.001080"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.975458" 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-28T22:41:13.975098" elapsed="0.000412"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.975798" 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-28T22:41:13.975616" elapsed="0.000213"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.976084" 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-28T22:41:13.975916" elapsed="0.000198"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.976385" 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-28T22:41:13.976201" elapsed="0.000216"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.976685" 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-28T22:41:13.976509" elapsed="0.000205"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.976974" 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-28T22:41:13.976804" elapsed="0.000200"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.977292" 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-28T22:41:13.977091" elapsed="0.000235"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.978039" 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-28T22:41:13.977714" elapsed="0.000374"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.978392" 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-28T22:41:13.978201" elapsed="0.000224"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:13.974997" elapsed="0.003461"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:13.972986" elapsed="0.005512"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.978838" 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-28T22:41:13.978609" elapsed="0.000315"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:13.980083" 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-28T22:41:13.979355" elapsed="0.001088"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:13.971792" elapsed="0.008919"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:13.981355" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:13.981030" elapsed="0.000405"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:13.969611" elapsed="0.011920"/>
</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-28T22:41:13.985155" 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-28T22:41:13.984177" elapsed="0.001013"/>
</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-28T22:41:13.985914" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:13.985337" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:13.985311" elapsed="0.000742"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:13.986112" elapsed="0.000048"/>
</return>
<msg time="2026-05-28T22:41:13.986389" 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-28T22:41:13.983161" elapsed="0.003259"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:14.388323" 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-28T22:41:14.388561" 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 14:41: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': 'b7bd35de2a37e11e6d5cf093cc1c9b51', 'X-Transparent': '00-b7bd35de2a37e11e6d5cf093cc1c9b51-91ebee6f518b8ef6-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': 'a02e04e01b40dd46-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":[{"t":1779979132288,"s":"btc_usdt","c":"73416.50","h":"78844.40","l":"72608.80","a":"230622","v":"1712083","o":"75399.80","r":"-0.0263"},{"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":1779979271925,"s":"doge_usdt","c":"0.09829","h":"0.10363","l":"0.09644","a":"6694774","v":"6681876","o":"0.10123","r":"-0.0290"}],"ts":1779979274370} 
 </msg>
<msg time="2026-05-28T22:41:14.388697" 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-28T22:41:14.389042" 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-28T22:41:13.987117" elapsed="0.402008"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:14.389428" elapsed="0.000140"/>
</return>
<msg time="2026-05-28T22:41:14.390023" 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-28T22:41:13.986662" elapsed="0.403429"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.392938" 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-28T22:41:14.391466" elapsed="0.001562"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.393646" 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-28T22:41:14.393214" elapsed="0.000459"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.393980" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:14.393814" elapsed="0.000238"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:14.390731" elapsed="0.003429"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.395003" 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-28T22:41:14.394288" elapsed="0.000782"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.396266" level="INFO">${tickers_list} = [{'t': 1779979132288, 's': 'btc_usdt', 'c': '73416.50', 'h': '78844.40', 'l': '72608.80', 'a': '230622', 'v': '1712083', 'o': '75399.80', 'r': '-0.0263'}, {'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-28T22:41:14.395313" elapsed="0.001000"/>
</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-28T22:41:14.397541" elapsed="0.000390"/>
</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-28T22:41:14.398198" elapsed="0.000341"/>
</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-28T22:41:14.398725" elapsed="0.000162"/>
</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-28T22:41:14.398981" elapsed="0.000111"/>
</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-28T22:41:14.399185" elapsed="0.000113"/>
</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-28T22:41:14.399391" elapsed="0.000139"/>
</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-28T22:41:14.399683" elapsed="0.000111"/>
</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-28T22:41:14.399888" 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-28T22:41:14.400102" elapsed="0.000105"/>
</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-28T22:41:14.401459" elapsed="0.000300"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.401889" elapsed="0.000175"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.402393" level="INFO">${timestamp_str} = 1779979132288</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:14.402184" elapsed="0.000236"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.402664" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:14.403190" 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-28T22:41:14.402553" elapsed="0.000662"/>
</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-28T22:41:14.403354" elapsed="0.000306"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.400432" elapsed="0.003311"/>
</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-28T22:41:14.404780" elapsed="0.000343"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.405845" 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-28T22:41:14.405433" elapsed="0.000502"/>
</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-28T22:41:14.406158" elapsed="0.000186"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.403944" elapsed="0.002480"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.407674" 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-28T22:41:14.407381" elapsed="0.000336"/>
</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-28T22:41:14.407845" elapsed="0.000346"/>
</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-28T22:41:14.408454" elapsed="0.000196"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.406620" elapsed="0.002120"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.409932" 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-28T22:41:14.409722" elapsed="0.000238"/>
</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-28T22:41:14.410062" elapsed="0.000211"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.410383" elapsed="0.000107"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.408956" elapsed="0.001589"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.411396" 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-28T22:41:14.411224" elapsed="0.000204"/>
</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-28T22:41:14.411525" elapsed="0.000188"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.411817" elapsed="0.000116"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.410658" elapsed="0.001333"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.413542" 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-28T22:41:14.413213" elapsed="0.000362"/>
</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-28T22:41:14.413691" elapsed="0.000213"/>
</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-28T22:41:14.414012" elapsed="0.000113"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.412132" elapsed="0.002060"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.415871" 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-28T22:41:14.415577" elapsed="0.000336"/>
</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-28T22:41:14.416056" elapsed="0.000274"/>
</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-28T22:41:14.416483" elapsed="0.000167"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.414475" elapsed="0.002255"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.417837" 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-28T22:41:14.417621" elapsed="0.000247"/>
</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-28T22:41:14.417987" elapsed="0.000241"/>
</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-28T22:41:14.418347" elapsed="0.000123"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.416901" elapsed="0.001628"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.419395" 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-28T22:41:14.419216" elapsed="0.000204"/>
</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-28T22:41:14.419517" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.419789" elapsed="0.000117"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.418657" elapsed="0.001309"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.396863" elapsed="0.023151"/>
</kw>
<var name="${ticker}">{'t': 1779979132288, 's': 'btc_usdt', 'c': '73416.50', 'h': '78844.40', 'l': '72608.80', 'a': '230622', 'v': '1712083', 'o': '75399.80', 'r': '-0.0263'}</var>
<status status="PASS" start="2026-05-28T22:41:14.396591" elapsed="0.023537"/>
</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-28T22:41:14.420906" elapsed="0.000163"/>
</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-28T22:41:14.421170" elapsed="0.000126"/>
</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-28T22:41:14.421394" elapsed="0.000124"/>
</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-28T22:41:14.421611" 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-28T22:41:14.421832" elapsed="0.000169"/>
</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-28T22:41:14.422098" elapsed="0.000121"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T22:41:14.422313" elapsed="0.000120"/>
</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-28T22:41:14.422527" 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-28T22:41:14.422745" elapsed="0.000121"/>
</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-28T22:41:14.423566" elapsed="0.000172"/>
</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-28T22:41:14.423837" elapsed="0.000157"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.424277" 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-28T22:41:14.424096" elapsed="0.000206"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.424507" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:14.424578" 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-28T22:41:14.424400" elapsed="0.000200"/>
</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-28T22:41:14.424695" elapsed="0.000217"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.423012" elapsed="0.001975"/>
</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-28T22:41:14.425651" elapsed="0.000132"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.425988" 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-28T22:41:14.425878" elapsed="0.000151"/>
</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-28T22:41:14.426123" elapsed="0.000116"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.425104" elapsed="0.001181"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.427038" 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-28T22:41:14.426887" elapsed="0.000172"/>
</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-28T22:41:14.427143" 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-28T22:41:14.427405" elapsed="0.000103"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.426389" elapsed="0.001170"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.428331" 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-28T22:41:14.428181" elapsed="0.000171"/>
</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-28T22:41:14.428439" 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-28T22:41:14.428696" elapsed="0.000104"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.427671" elapsed="0.001179"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.429569" 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-28T22:41:14.429421" elapsed="0.000169"/>
</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-28T22:41:14.429672" elapsed="0.000159"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.429965" elapsed="0.000106"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.428950" elapsed="0.001173"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.430958" 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-28T22:41:14.430704" elapsed="0.000276"/>
</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-28T22:41:14.431065" 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-28T22:41:14.431320" elapsed="0.000105"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.430225" elapsed="0.001252"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.432203" 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-28T22:41:14.432056" elapsed="0.000168"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.432317" 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-28T22:41:14.432581" elapsed="0.000106"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.431578" elapsed="0.001164"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.433491" 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-28T22:41:14.433341" 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-28T22:41:14.433601" 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-28T22:41:14.433859" elapsed="0.000104"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.432844" elapsed="0.001168"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.434649" 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-28T22:41:14.434517" elapsed="0.000150"/>
</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-28T22:41:14.434741" elapsed="0.000124"/>
</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-28T22:41:14.434946" elapsed="0.000090"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.434111" elapsed="0.000971"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.420417" elapsed="0.014702"/>
</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-28T22:41:14.420241" elapsed="0.014900"/>
</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-28T22:41:14.435523" elapsed="0.000091"/>
</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-28T22:41:14.435688" elapsed="0.000091"/>
</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-28T22:41:14.435851" elapsed="0.000092"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T22:41:14.436015" elapsed="0.000091"/>
</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-28T22:41:14.436178" elapsed="0.000086"/>
</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-28T22:41:14.436336" elapsed="0.000089"/>
</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-28T22:41:14.436495" elapsed="0.000098"/>
</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-28T22:41:14.436727" elapsed="0.000165"/>
</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-28T22:41:14.436994" elapsed="0.000135"/>
</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-28T22:41:14.437864" elapsed="0.000159"/>
</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-28T22:41:14.438111" elapsed="0.000140"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.438470" 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-28T22:41:14.438334" elapsed="0.000158"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.438654" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:14.438709" 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-28T22:41:14.438572" elapsed="0.000156"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp_length} &gt;= 10</arg>
<arg>时间戳长度应该至少10位</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.438804" elapsed="0.000182"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.437361" elapsed="0.001671"/>
</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-28T22:41:14.439584" elapsed="0.000100"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.439841" 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-28T22:41:14.439759" elapsed="0.000228"/>
</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-28T22:41:14.440063" elapsed="0.000102"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.439133" elapsed="0.001076"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.440895" 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-28T22:41:14.440757" 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-28T22:41:14.440992" 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-28T22:41:14.441235" elapsed="0.000099"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.440303" elapsed="0.001079"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.442036" 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-28T22:41:14.441910" elapsed="0.000144"/>
</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-28T22:41:14.442123" elapsed="0.000136"/>
</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-28T22:41:14.442339" elapsed="0.000090"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.441475" elapsed="0.000997"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.443079" 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-28T22:41:14.442955" elapsed="0.000142"/>
</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-28T22:41:14.443166" 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-28T22:41:14.443379" elapsed="0.000088"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.442557" elapsed="0.000952"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.444106" 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-28T22:41:14.443987" 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-28T22:41:14.444195" elapsed="0.000136"/>
</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-28T22:41:14.444407" elapsed="0.000088"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.443592" elapsed="0.000945"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.445208" 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-28T22:41:14.445018" elapsed="0.000214"/>
</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-28T22:41:14.445325" elapsed="0.000208"/>
</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-28T22:41:14.445630" elapsed="0.000097"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.444620" elapsed="0.001154"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.446396" 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-28T22:41:14.446275" elapsed="0.000139"/>
</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-28T22:41:14.446480" elapsed="0.000223"/>
</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-28T22:41:14.446810" elapsed="0.000146"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.445865" elapsed="0.001186"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.447754" 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-28T22:41:14.447618" elapsed="0.000156"/>
</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-28T22:41:14.447840" elapsed="0.000114"/>
</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-28T22:41:14.448025" elapsed="0.000080"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.447166" elapsed="0.000979"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.435338" elapsed="0.012841"/>
</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-28T22:41:14.435214" elapsed="0.012986"/>
</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-28T22:41:14.448545" elapsed="0.000083"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T22:41:14.448697" elapsed="0.000084"/>
</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-28T22:41:14.448848" 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-28T22:41:14.448991" elapsed="0.000204"/>
</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-28T22:41:14.449259" elapsed="0.000078"/>
</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-28T22:41:14.449399" elapsed="0.000078"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T22:41:14.449538" elapsed="0.000078"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T22:41:14.449677" elapsed="0.000077"/>
</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-28T22:41:14.449815" elapsed="0.000078"/>
</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-28T22:41:14.450351" elapsed="0.000111"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.450527" elapsed="0.000101"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.450806" level="INFO">${timestamp_str} = 1779979271925</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:14.450695" elapsed="0.000127"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.450953" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:14.450997" 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-28T22:41:14.450887" elapsed="0.000125"/>
</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-28T22:41:14.451074" elapsed="0.000140"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.449994" elapsed="0.001256"/>
</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-28T22:41:14.451677" elapsed="0.000080"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.451884" 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-28T22:41:14.451818" elapsed="0.000092"/>
</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-28T22:41:14.451970" elapsed="0.000078"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.451327" elapsed="0.000797"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.452671" 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-28T22:41:14.452561" elapsed="0.000126"/>
</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-28T22:41:14.452749" elapsed="0.000124"/>
</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-28T22:41:14.452941" elapsed="0.000077"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.452200" elapsed="0.000857"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.453602" 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-28T22:41:14.453493" elapsed="0.000125"/>
</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-28T22:41:14.453678" 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-28T22:41:14.453856" elapsed="0.000073"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.453133" elapsed="0.000831"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.454464" 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-28T22:41:14.454362" elapsed="0.000117"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.454537" elapsed="0.000112"/>
</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-28T22:41:14.454712" elapsed="0.000069"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.454035" elapsed="0.000782"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.455325" 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-28T22:41:14.455221" 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-28T22:41:14.455397" 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-28T22:41:14.455576" elapsed="0.000073"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.454887" elapsed="0.000796"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.456909" 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-28T22:41:14.456799" elapsed="0.000126"/>
</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-28T22:41:14.456984" 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-28T22:41:14.457163" elapsed="0.000072"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.455754" elapsed="0.001517"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.457769" 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-28T22:41:14.457673" elapsed="0.000110"/>
</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-28T22:41:14.457838" elapsed="0.000107"/>
</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-28T22:41:14.458004" elapsed="0.000069"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.457341" elapsed="0.000765"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.458579" 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-28T22:41:14.458483" 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-28T22:41:14.458648" elapsed="0.000121"/>
</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-28T22:41:14.458828" elapsed="0.000066"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.458171" elapsed="0.000757"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.448377" elapsed="0.010578"/>
</kw>
<var name="${ticker}">{'t': 1779979271925, 's': 'doge_usdt', 'c': '0.09829', 'h': '0.10363', 'l': '0.09644', 'a': '6694774', 'v': '6681876', 'o': '0.10123', 'r': '-0.0290'}</var>
<status status="PASS" start="2026-05-28T22:41:14.448266" elapsed="0.010703"/>
</iter>
<var>${ticker}</var>
<value>@{tickers_list}</value>
<status status="PASS" start="2026-05-28T22:41:14.396412" elapsed="0.062575"/>
</for>
<doc>验证期货U本位Tickers接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:13.981625" elapsed="0.477455"/>
</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-28T22:41:14.460814" 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-28T22:41:14.460460" elapsed="0.000371"/>
</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-28T22:41:14.461175" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:14.460906" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:14.460891" elapsed="0.000331"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:14.461240" elapsed="0.000024"/>
</return>
<msg time="2026-05-28T22:41:14.461354" 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-28T22:41:14.460069" elapsed="0.001300"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:14.640469" 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-28T22:41:14.640721" 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 14:41: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': 'cc07fd7c6681574e205c77affbd68074', 'X-Transparent': '00-cc07fd7c6681574e205c77affbd68074-c66e129c50a82802-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': 'a02e04e1bfc9dd46-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":[{"t":1779979132288,"s":"btc_usdt","c":"73416.50","h":"78844.40","l":"72608.80","a":"230622","v":"1712083","o":"75399.80","r":"-0.0263"},{"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":1779979271925,"s":"doge_usdt","c":"0.09829","h":"0.10363","l":"0.09644","a":"6694774","v":"6681876","o":"0.10123","r":"-0.0290"}],"ts":1779979274622} 
 </msg>
<msg time="2026-05-28T22:41:14.640836" 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-28T22:41:14.641223" 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-28T22:41:14.461625" elapsed="0.179632"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:14.641393" elapsed="0.000073"/>
</return>
<msg time="2026-05-28T22:41:14.641808" 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-28T22:41:14.461440" elapsed="0.180431"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.644350" 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-28T22:41:14.643229" elapsed="0.001321"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.646281" 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-28T22:41:14.645182" elapsed="0.001263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.647157" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:14.646769" elapsed="0.000485"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:14.642327" elapsed="0.005045"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.648617" 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-28T22:41:14.647611" elapsed="0.001098"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.649614" level="INFO">${tickers_list} = [{'t': 1779979132288, 's': 'btc_usdt', 'c': '73416.50', 'h': '78844.40', 'l': '72608.80', 'a': '230622', 'v': '1712083', 'o': '75399.80', 'r': '-0.0263'}, {'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-28T22:41:14.648951" elapsed="0.000707"/>
</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-28T22:41:14.650784" elapsed="0.000191"/>
</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-28T22:41:14.651103" elapsed="0.000125"/>
</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-28T22:41:14.651327" elapsed="0.000121"/>
</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-28T22:41:14.651546" elapsed="0.000617"/>
</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-28T22:41:14.652325" elapsed="0.000226"/>
</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-28T22:41:14.652730" 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-28T22:41:14.652970" elapsed="0.000134"/>
</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-28T22:41:14.653210" elapsed="0.000352"/>
</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-28T22:41:14.653718" elapsed="0.000146"/>
</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-28T22:41:14.655147" elapsed="0.000384"/>
</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-28T22:41:14.655690" elapsed="0.000227"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.656310" level="INFO">${timestamp_str} = 1779979132288</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:14.656060" elapsed="0.000285"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.656788" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:14.656900" 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-28T22:41:14.656567" elapsed="0.000366"/>
</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-28T22:41:14.657093" elapsed="0.000329"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.654101" elapsed="0.003409"/>
</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-28T22:41:14.658468" elapsed="0.000137"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.658823" 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-28T22:41:14.658711" elapsed="0.000155"/>
</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-28T22:41:14.658966" elapsed="0.000132"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.657700" elapsed="0.001455"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.660101" 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-28T22:41:14.659904" 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-28T22:41:14.660229" 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-28T22:41:14.660581" elapsed="0.000152"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.659292" elapsed="0.001507"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.661722" 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-28T22:41:14.661541" elapsed="0.000208"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.661913" elapsed="0.000207"/>
</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-28T22:41:14.662235" elapsed="0.000131"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.660928" elapsed="0.001501"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.663314" 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-28T22:41:14.663132" elapsed="0.000208"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.663440" elapsed="0.000201"/>
</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-28T22:41:14.663755" elapsed="0.000126"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.662553" elapsed="0.001392"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.664820" 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-28T22:41:14.664641" 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-28T22:41:14.664945" elapsed="0.000198"/>
</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-28T22:41:14.665256" elapsed="0.000127"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.664067" elapsed="0.001383"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.666478" 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-28T22:41:14.666139" elapsed="0.000362"/>
</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-28T22:41:14.666589" elapsed="0.000175"/>
</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-28T22:41:14.666857" elapsed="0.000111"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.665576" elapsed="0.001445"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.667767" 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-28T22:41:14.667615" 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-28T22:41:14.667876" elapsed="0.000171"/>
</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-28T22:41:14.668145" elapsed="0.000110"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.667128" elapsed="0.001180"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.669053" 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-28T22:41:14.668896" elapsed="0.000178"/>
</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-28T22:41:14.669161" elapsed="0.000141"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.669398" elapsed="0.000106"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.668421" elapsed="0.001137"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.650266" elapsed="0.019336"/>
</kw>
<var name="${ticker}">{'t': 1779979132288, 's': 'btc_usdt', 'c': '73416.50', 'h': '78844.40', 'l': '72608.80', 'a': '230622', 'v': '1712083', 'o': '75399.80', 'r': '-0.0263'}</var>
<status status="PASS" start="2026-05-28T22:41:14.649966" elapsed="0.019663"/>
</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-28T22:41:14.670104" elapsed="0.000118"/>
</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-28T22:41:14.670309" elapsed="0.000111"/>
</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-28T22:41:14.670506" elapsed="0.000171"/>
</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-28T22:41:14.670764" elapsed="0.000110"/>
</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-28T22:41:14.670970" elapsed="0.000111"/>
</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-28T22:41:14.671166" elapsed="0.000110"/>
</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-28T22:41:14.671365" elapsed="0.000107"/>
</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-28T22:41:14.671560" elapsed="0.000456"/>
</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-28T22:41:14.672213" elapsed="0.000218"/>
</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-28T22:41:14.673247" elapsed="0.000205"/>
</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-28T22:41:14.673555" elapsed="0.000166"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.673986" 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-28T22:41:14.673824" elapsed="0.000188"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.674196" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:14.674254" 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-28T22:41:14.674104" 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-28T22:41:14.674346" elapsed="0.000170"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.672600" elapsed="0.001963"/>
</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-28T22:41:14.675128" elapsed="0.000104"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.675385" 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-28T22:41:14.675305" 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-28T22:41:14.675488" elapsed="0.000095"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.674666" elapsed="0.000957"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.676478" 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-28T22:41:14.676294" elapsed="0.000209"/>
</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-28T22:41:14.676595" elapsed="0.000365"/>
</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-28T22:41:14.677068" elapsed="0.000110"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.675720" elapsed="0.001513"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.677983" 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-28T22:41:14.677832" elapsed="0.000173"/>
</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-28T22:41:14.678088" elapsed="0.000160"/>
</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-28T22:41:14.678342" elapsed="0.000102"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.677342" elapsed="0.001152"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.679200" 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-28T22:41:14.679055" 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-28T22:41:14.679305" 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-28T22:41:14.679616" elapsed="0.000156"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.678594" elapsed="0.001236"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.680763" 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-28T22:41:14.680551" elapsed="0.000296"/>
</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-28T22:41:14.680931" elapsed="0.000172"/>
</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-28T22:41:14.681191" elapsed="0.000099"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.679979" elapsed="0.001378"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.682124" 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-28T22:41:14.681971" 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-28T22:41:14.682252" elapsed="0.000154"/>
</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-28T22:41:14.682490" elapsed="0.000092"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.681484" elapsed="0.001143"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.683263" 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-28T22:41:14.683136" elapsed="0.000144"/>
</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-28T22:41:14.683349" elapsed="0.000135"/>
</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-28T22:41:14.683561" elapsed="0.000087"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.682715" elapsed="0.000975"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.684285" 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-28T22:41:14.684162" elapsed="0.000144"/>
</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-28T22:41:14.684376" 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-28T22:41:14.684577" elapsed="0.000086"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.683778" elapsed="0.000929"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.669882" elapsed="0.014860"/>
</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-28T22:41:14.669729" elapsed="0.015035"/>
</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-28T22:41:14.685144" elapsed="0.000089"/>
</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-28T22:41:14.685303" elapsed="0.000084"/>
</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-28T22:41:14.685456" elapsed="0.000085"/>
</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-28T22:41:14.685609" elapsed="0.000087"/>
</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-28T22:41:14.685763" elapsed="0.000086"/>
</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-28T22:41:14.685916" elapsed="0.000084"/>
</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-28T22:41:14.686070" elapsed="0.000078"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T22:41:14.686211" elapsed="0.000078"/>
</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-28T22:41:14.686417" elapsed="0.000289"/>
</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-28T22:41:14.687305" elapsed="0.000127"/>
</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-28T22:41:14.687498" elapsed="0.000106"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.687827" 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-28T22:41:14.687694" elapsed="0.000150"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.688020" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:14.688065" 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-28T22:41:14.687953" elapsed="0.000126"/>
</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-28T22:41:14.688141" elapsed="0.000142"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.686817" elapsed="0.001504"/>
</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-28T22:41:14.688772" elapsed="0.000078"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.688990" 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-28T22:41:14.688911" 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-28T22:41:14.689076" elapsed="0.000078"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.688403" elapsed="0.000785"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.689740" 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-28T22:41:14.689626" 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-28T22:41:14.689817" 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-28T22:41:14.690016" elapsed="0.000081"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.689264" elapsed="0.000871"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.690687" 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-28T22:41:14.690577" elapsed="0.000125"/>
</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-28T22:41:14.690763" 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-28T22:41:14.690950" elapsed="0.000077"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.690210" elapsed="0.000884"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.691732" 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-28T22:41:14.691605" elapsed="0.000142"/>
</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-28T22:41:14.691808" elapsed="0.000121"/>
</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-28T22:41:14.691994" elapsed="0.000077"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.691196" elapsed="0.000912"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.692648" 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-28T22:41:14.692540" elapsed="0.000123"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.692723" elapsed="0.000117"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.692906" elapsed="0.000076"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.692181" elapsed="0.000837"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.693549" 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-28T22:41:14.693445" elapsed="0.000119"/>
</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-28T22:41:14.693624" elapsed="0.000120"/>
</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-28T22:41:14.693810" elapsed="0.000076"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.693095" elapsed="0.000829"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.695003" 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-28T22:41:14.694461" elapsed="0.000560"/>
</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-28T22:41:14.695098" elapsed="0.000138"/>
</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-28T22:41:14.695304" elapsed="0.000077"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.694040" elapsed="0.001388"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.695977" 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-28T22:41:14.695869" elapsed="0.000123"/>
</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-28T22:41:14.696052" 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-28T22:41:14.696220" elapsed="0.000072"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.695515" elapsed="0.000814"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.684968" elapsed="0.011390"/>
</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-28T22:41:14.684846" elapsed="0.011530"/>
</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-28T22:41:14.696720" elapsed="0.000277"/>
</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-28T22:41:14.697116" elapsed="0.000124"/>
</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-28T22:41:14.697304" elapsed="0.000251"/>
</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-28T22:41:14.697634" elapsed="0.000098"/>
</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-28T22:41:14.697792" elapsed="0.000086"/>
</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-28T22:41:14.697941" elapsed="0.000076"/>
</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-28T22:41:14.698080" elapsed="0.000073"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-05-28T22:41:14.698208" elapsed="0.000067"/>
</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-28T22:41:14.698329" elapsed="0.000067"/>
</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-28T22:41:14.698834" elapsed="0.000105"/>
</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-28T22:41:14.698997" elapsed="0.000084"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.699235" level="INFO">${timestamp_str} = 1779979271925</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:14.699136" elapsed="0.000115"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.699361" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:14.699398" 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-28T22:41:14.699305" elapsed="0.000105"/>
</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-28T22:41:14.699461" elapsed="0.000120"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.698484" elapsed="0.001129"/>
</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-28T22:41:14.700017" elapsed="0.000069"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.700195" 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-28T22:41:14.700138" elapsed="0.000079"/>
</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-28T22:41:14.700267" elapsed="0.000066"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.699683" elapsed="0.000677"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.700842" 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-28T22:41:14.700745" elapsed="0.000110"/>
</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-28T22:41:14.700907" elapsed="0.000117"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.701133" elapsed="0.000072"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.700426" elapsed="0.000813"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.701814" 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-28T22:41:14.701612" elapsed="0.000216"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.701880" elapsed="0.000104"/>
</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-28T22:41:14.702055" elapsed="0.000097"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.701306" elapsed="0.000883"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.702718" 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-28T22:41:14.702606" elapsed="0.000126"/>
</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-28T22:41:14.702791" elapsed="0.000112"/>
</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-28T22:41:14.702972" elapsed="0.000071"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.702260" elapsed="0.000818"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.703579" 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-28T22:41:14.703475" elapsed="0.000118"/>
</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-28T22:41:14.703649" elapsed="0.000109"/>
</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-28T22:41:14.703818" elapsed="0.000069"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.703144" elapsed="0.000777"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.704400" 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-28T22:41:14.704303" elapsed="0.000112"/>
</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-28T22:41:14.704469" elapsed="0.000105"/>
</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-28T22:41:14.704634" elapsed="0.000069"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.703989" elapsed="0.000748"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.705484" 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-28T22:41:14.705276" elapsed="0.000226"/>
</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-28T22:41:14.705562" 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-28T22:41:14.705738" elapsed="0.000072"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.704803" elapsed="0.001040"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.706480" 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-28T22:41:14.706373" elapsed="0.000121"/>
</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-28T22:41:14.706548" elapsed="0.000093"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.706698" elapsed="0.000065"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.705924" elapsed="0.000870"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.696541" elapsed="0.010281"/>
</kw>
<var name="${ticker}">{'t': 1779979271925, 's': 'doge_usdt', 'c': '0.09829', 'h': '0.10363', 'l': '0.09644', 'a': '6694774', 'v': '6681876', 'o': '0.10123', 'r': '-0.0290'}</var>
<status status="PASS" start="2026-05-28T22:41:14.696438" elapsed="0.010561"/>
</iter>
<var>${ticker}</var>
<value>@{tickers_list}</value>
<status status="PASS" start="2026-05-28T22:41:14.649755" elapsed="0.057280"/>
</for>
<doc>验证期货U本位Tickers接口功能（仅预测交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:14.459219" elapsed="0.247950"/>
</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-28T22:41:14.708878" 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-28T22:41:14.708540" elapsed="0.000354"/>
</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-28T22:41:14.709219" elapsed="0.000011"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:14.708963" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:14.708951" elapsed="0.000310"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:14.709279" elapsed="0.000021"/>
</return>
<msg time="2026-05-28T22:41:14.709383" 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-28T22:41:14.708144" elapsed="0.001252"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:14.831516" 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-28T22:41:14.831600" 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 14:41: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': '51f8af396929c2644d2ea6a7ece6b320', 'X-Transparent': '00-51f8af396929c2644d2ea6a7ece6b320-d548bd5656c1ea5a-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': 'a02e04e34d1cdd46-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":[{"t":1779979132288,"s":"btc_usdt","c":"73416.50","h":"78844.40","l":"72608.80","a":"230622","v":"1712083","o":"75399.80","r":"-0.0263"},{"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":1779979271925,"s":"doge_usdt","c":"0.09829","h":"0.10363","l":"0.09644","a":"6694774","v":"6681876","o":"0.10123","r":"-0.0290"}],"ts":1779979274814} 
 </msg>
<msg time="2026-05-28T22:41:14.831633" 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-28T22:41:14.831729" 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-28T22:41:14.709647" elapsed="0.122094"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:14.831788" elapsed="0.000026"/>
</return>
<msg time="2026-05-28T22:41:14.831881" 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-28T22:41:14.709466" elapsed="0.122426"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.832497" 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-28T22:41:14.832138" elapsed="0.000387"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.832761" 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-28T22:41:14.832576" elapsed="0.000196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.832867" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:14.832814" elapsed="0.000070"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:14.831991" elapsed="0.000936"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.833168" 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-28T22:41:14.832969" elapsed="0.000222"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.833465" level="INFO">${tickers_list} = [{'t': 1779979132288, 's': 'btc_usdt', 'c': '73416.50', 'h': '78844.40', 'l': '72608.80', 'a': '230622', 'v': '1712083', 'o': '75399.80', 'r': '-0.0263'}, {'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-28T22:41:14.833247" elapsed="0.000231"/>
</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-28T22:41:14.833796" elapsed="0.000059"/>
</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-28T22:41:14.833902" elapsed="0.000057"/>
</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-28T22:41:14.834003" elapsed="0.000055"/>
</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-28T22:41:14.834103" elapsed="0.000053"/>
</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-28T22:41:14.834200" elapsed="0.000056"/>
</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-28T22:41:14.834299" elapsed="0.000056"/>
</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-28T22:41:14.834398" elapsed="0.000055"/>
</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-28T22:41:14.834503" elapsed="0.000059"/>
</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-28T22:41:14.834606" elapsed="0.000056"/>
</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-28T22:41:14.835002" 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-28T22:41:14.835157" elapsed="0.000080"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.835357" level="INFO">${timestamp_str} = 1779979132288</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:14.835286" elapsed="0.000081"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.835456" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:14.835484" 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-28T22:41:14.835410" elapsed="0.000083"/>
</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-28T22:41:14.835531" elapsed="0.000105"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.834729" elapsed="0.000937"/>
</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-28T22:41:14.835997" elapsed="0.000060"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.836150" 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-28T22:41:14.836102" elapsed="0.000067"/>
</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-28T22:41:14.836211" elapsed="0.000127"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.835725" elapsed="0.000649"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.836836" 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-28T22:41:14.836732" elapsed="0.000117"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.836897" elapsed="0.000098"/>
</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-28T22:41:14.837051" elapsed="0.000071"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.836443" elapsed="0.000706"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.837617" 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-28T22:41:14.837471" 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-28T22:41:14.837670" elapsed="0.000084"/>
</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-28T22:41:14.837800" elapsed="0.000052"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.837205" elapsed="0.000701"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.838288" 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-28T22:41:14.838198" elapsed="0.000102"/>
</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-28T22:41:14.838382" elapsed="0.000298"/>
</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-28T22:41:14.838813" elapsed="0.000104"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.837960" elapsed="0.001003"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.839548" 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-28T22:41:14.839459" elapsed="0.000102"/>
</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-28T22:41:14.839606" elapsed="0.000094"/>
</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-28T22:41:14.839751" elapsed="0.000062"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.839047" elapsed="0.000794"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.840216" 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-28T22:41:14.840144" elapsed="0.000083"/>
</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-28T22:41:14.840267" elapsed="0.000079"/>
</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-28T22:41:14.840390" elapsed="0.000048"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.839900" elapsed="0.000562"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.840810" 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-28T22:41:14.840737" elapsed="0.000083"/>
</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-28T22:41:14.840860" elapsed="0.000077"/>
</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-28T22:41:14.840982" elapsed="0.000047"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.840510" elapsed="0.000543"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.841396" 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-28T22:41:14.841328" elapsed="0.000078"/>
</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-28T22:41:14.841445" elapsed="0.000064"/>
</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-28T22:41:14.841565" elapsed="0.000060"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.841102" elapsed="0.000556"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.833672" elapsed="0.008021"/>
</kw>
<var name="${ticker}">{'t': 1779979132288, 's': 'btc_usdt', 'c': '73416.50', 'h': '78844.40', 'l': '72608.80', 'a': '230622', 'v': '1712083', 'o': '75399.80', 'r': '-0.0263'}</var>
<status status="PASS" start="2026-05-28T22:41:14.833574" elapsed="0.008143"/>
</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-28T22:41:14.841986" elapsed="0.000072"/>
</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-28T22:41:14.842106" elapsed="0.000060"/>
</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-28T22:41:14.842208" elapsed="0.000057"/>
</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-28T22:41:14.842312" elapsed="0.000055"/>
</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-28T22:41:14.842412" elapsed="0.000056"/>
</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-28T22:41:14.842510" elapsed="0.000055"/>
</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-28T22:41:14.842664" elapsed="0.000061"/>
</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-28T22:41:14.842769" elapsed="0.000057"/>
</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-28T22:41:14.842870" elapsed="0.000056"/>
</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-28T22:41:14.843287" elapsed="0.000178"/>
</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-28T22:41:14.843515" elapsed="0.000079"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.843773" 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-28T22:41:14.843666" elapsed="0.000119"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.843878" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:14.843915" 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-28T22:41:14.843831" elapsed="0.000096"/>
</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-28T22:41:14.843977" elapsed="0.000132"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.842991" elapsed="0.001152"/>
</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-28T22:41:14.844506" elapsed="0.000052"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.844643" 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-28T22:41:14.844599" elapsed="0.000061"/>
</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-28T22:41:14.844700" elapsed="0.000053"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.844255" elapsed="0.000520"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.845149" 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-28T22:41:14.845073" elapsed="0.000086"/>
</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-28T22:41:14.845200" elapsed="0.000084"/>
</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-28T22:41:14.845331" elapsed="0.000055"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.844826" elapsed="0.000586"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.845781" 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-28T22:41:14.845696" elapsed="0.000096"/>
</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-28T22:41:14.845831" elapsed="0.000081"/>
</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-28T22:41:14.845957" elapsed="0.000051"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.845462" elapsed="0.000571"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.846396" 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-28T22:41:14.846324" elapsed="0.000083"/>
</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-28T22:41:14.846447" elapsed="0.000090"/>
</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-28T22:41:14.846593" elapsed="0.000457"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.846083" elapsed="0.001016"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.847655" 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-28T22:41:14.847555" elapsed="0.000121"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.847723" elapsed="0.000096"/>
</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-28T22:41:14.847873" elapsed="0.000068"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.847210" elapsed="0.000832"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.848470" 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-28T22:41:14.848397" elapsed="0.000084"/>
</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-28T22:41:14.848522" elapsed="0.000084"/>
</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-28T22:41:14.848650" elapsed="0.000051"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.848115" elapsed="0.000612"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.849076" 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-28T22:41:14.849004" elapsed="0.000082"/>
</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-28T22:41:14.849127" elapsed="0.000081"/>
</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-28T22:41:14.849252" elapsed="0.000052"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.848776" elapsed="0.000552"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.849747" 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-28T22:41:14.849605" elapsed="0.000153"/>
</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-28T22:41:14.849799" elapsed="0.000082"/>
</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-28T22:41:14.849927" elapsed="0.000055"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.849378" elapsed="0.000645"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.841864" elapsed="0.008186"/>
</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-28T22:41:14.841783" elapsed="0.008279"/>
</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-28T22:41:14.850287" elapsed="0.000062"/>
</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-28T22:41:14.850393" elapsed="0.000053"/>
</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-28T22:41:14.850490" elapsed="0.000055"/>
</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-28T22:41:14.850587" elapsed="0.000054"/>
</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-28T22:41:14.850688" elapsed="0.000054"/>
</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-28T22:41:14.850785" elapsed="0.000054"/>
</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-28T22:41:14.850883" elapsed="0.000054"/>
</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-28T22:41:14.850980" elapsed="0.000054"/>
</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-28T22:41:14.851077" elapsed="0.000054"/>
</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-28T22:41:14.851449" elapsed="0.000079"/>
</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-28T22:41:14.851573" elapsed="0.000071"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.851775" 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-28T22:41:14.851690" elapsed="0.000096"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.851880" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:14.851912" 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-28T22:41:14.851832" elapsed="0.000089"/>
</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-28T22:41:14.851963" elapsed="0.000163"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.851194" elapsed="0.001002"/>
</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-28T22:41:14.852572" elapsed="0.000067"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.852730" 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-28T22:41:14.852685" elapsed="0.000063"/>
</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-28T22:41:14.852787" elapsed="0.000052"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.852261" elapsed="0.000600"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.853225" 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-28T22:41:14.853147" elapsed="0.000088"/>
</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-28T22:41:14.853281" elapsed="0.000089"/>
</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-28T22:41:14.853426" elapsed="0.000053"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.852911" elapsed="0.000593"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.853887" 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-28T22:41:14.853806" elapsed="0.000093"/>
</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-28T22:41:14.853949" elapsed="0.000094"/>
</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-28T22:41:14.854089" elapsed="0.000050"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.853554" elapsed="0.000618"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.854584" 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-28T22:41:14.854516" elapsed="0.000078"/>
</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-28T22:41:14.854633" elapsed="0.000077"/>
</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-28T22:41:14.854752" elapsed="0.000049"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.854226" elapsed="0.000599"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.855801" 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-28T22:41:14.855664" elapsed="0.000153"/>
</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-28T22:41:14.855879" elapsed="0.000121"/>
</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-28T22:41:14.856070" elapsed="0.000067"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.854882" elapsed="0.001288"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.856633" 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-28T22:41:14.856555" elapsed="0.000089"/>
</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-28T22:41:14.856693" elapsed="0.000089"/>
</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-28T22:41:14.856828" elapsed="0.000054"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.856249" elapsed="0.000659"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.857280" 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-28T22:41:14.857207" elapsed="0.000084"/>
</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-28T22:41:14.857332" elapsed="0.000081"/>
</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-28T22:41:14.857458" elapsed="0.000052"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.856960" elapsed="0.000611"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.857925" 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-28T22:41:14.857851" elapsed="0.000085"/>
</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-28T22:41:14.857976" elapsed="0.000070"/>
</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-28T22:41:14.858092" elapsed="0.000049"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.857622" elapsed="0.000545"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.850183" elapsed="0.008007"/>
</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-28T22:41:14.850110" elapsed="0.008096"/>
</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-28T22:41:14.858478" elapsed="0.000058"/>
</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-28T22:41:14.858580" elapsed="0.000051"/>
</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-28T22:41:14.858679" elapsed="0.000056"/>
</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-28T22:41:14.858780" elapsed="0.000056"/>
</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-28T22:41:14.858880" elapsed="0.000052"/>
</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-28T22:41:14.858976" elapsed="0.000053"/>
</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-28T22:41:14.859074" elapsed="0.000054"/>
</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-28T22:41:14.859170" elapsed="0.000054"/>
</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-28T22:41:14.859267" elapsed="0.000053"/>
</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-28T22:41:14.859658" elapsed="0.000085"/>
</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-28T22:41:14.859790" elapsed="0.000072"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.860900" level="INFO">${timestamp_str} = 1779979271925</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:14.859908" elapsed="0.001008"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.861033" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:14.861064" 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-28T22:41:14.860978" elapsed="0.000095"/>
</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-28T22:41:14.861115" elapsed="0.000107"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.859387" elapsed="0.001862"/>
</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-28T22:41:14.861563" elapsed="0.000057"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.861714" 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-28T22:41:14.861669" elapsed="0.000062"/>
</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-28T22:41:14.861771" elapsed="0.000053"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.861312" elapsed="0.000536"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.862207" 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-28T22:41:14.862133" elapsed="0.000084"/>
</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-28T22:41:14.862259" elapsed="0.000084"/>
</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-28T22:41:14.862409" elapsed="0.000052"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.861898" elapsed="0.000589"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.862841" 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-28T22:41:14.862768" elapsed="0.000117"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.862926" elapsed="0.000080"/>
</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-28T22:41:14.863052" elapsed="0.000051"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.862537" elapsed="0.000591"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.864166" 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-28T22:41:14.863922" elapsed="0.000273"/>
</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-28T22:41:14.864295" elapsed="0.000129"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T22:41:14.864485" elapsed="0.000070"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.863180" elapsed="0.001410"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.865110" 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-28T22:41:14.865017" elapsed="0.000105"/>
</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-28T22:41:14.865162" elapsed="0.000082"/>
</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-28T22:41:14.865289" elapsed="0.000050"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.864687" elapsed="0.000676"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.865721" 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-28T22:41:14.865650" elapsed="0.000082"/>
</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-28T22:41:14.865770" elapsed="0.000078"/>
</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-28T22:41:14.865891" elapsed="0.000047"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.865415" elapsed="0.000548"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.866322" 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-28T22:41:14.866254" elapsed="0.000078"/>
</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-28T22:41:14.866372" elapsed="0.000076"/>
</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-28T22:41:14.866491" elapsed="0.000061"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.866011" elapsed="0.000567"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.866979" 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-28T22:41:14.866905" elapsed="0.000088"/>
</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-28T22:41:14.867037" elapsed="0.000072"/>
</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-28T22:41:14.867159" elapsed="0.000150"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.866640" elapsed="0.000697"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-05-28T22:41:14.858346" elapsed="0.009016"/>
</kw>
<var name="${ticker}">{'t': 1779979271925, 's': 'doge_usdt', 'c': '0.09829', 'h': '0.10363', 'l': '0.09644', 'a': '6694774', 'v': '6681876', 'o': '0.10123', 'r': '-0.0290'}</var>
<status status="PASS" start="2026-05-28T22:41:14.858256" elapsed="0.009126"/>
</iter>
<var>${ticker}</var>
<value>@{tickers_list}</value>
<status status="PASS" start="2026-05-28T22:41:14.833509" elapsed="0.033894"/>
</for>
<doc>验证期货U本位Tickers接口功能（仅交割交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-05-28T22:41:14.707348" elapsed="0.160138"/>
</test>
<doc>期货U本位Tickers接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:13.961229" elapsed="0.906475"/>
</suite>
<status status="PASS" start="2026-05-28T22:41:07.653792" elapsed="7.214457"/>
</suite>
<status status="PASS" start="2026-05-28T22:41:07.001525" elapsed="7.867178"/>
</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-28T22:41:14.872642" 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-28T22:41:14.872501" elapsed="0.000163"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.872899" 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-28T22:41:14.872825" elapsed="0.000097"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:14.872723" elapsed="0.000215"/>
</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-28T22:41:14.872995" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:14.872950" elapsed="0.000067"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:14.872704" elapsed="0.000322"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.873405" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:14.873354" elapsed="0.000069"/>
</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-28T22:41:14.873517" 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-28T22:41:14.873566" 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-28T22:41:14.873613" 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-28T22:41:14.873657" 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-28T22:41:14.873700" elapsed="0.000007"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:14.873449" elapsed="0.000270"/>
</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-28T22:41:14.873787" 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-28T22:41:14.873832" 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-28T22:41:14.873878" 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-28T22:41:14.873921" elapsed="0.000007"/>
</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-28T22:41:14.873963" 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-28T22:41:14.874006" 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-28T22:41:14.874049" 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-28T22:41:14.874091" 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-28T22:41:14.874134" elapsed="0.000007"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:14.873727" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.874283" 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-28T22:41:14.874195" elapsed="0.000105"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.874424" 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-28T22:41:14.874346" elapsed="0.000094"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.874561" 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-28T22:41:14.874484" elapsed="0.000092"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.874698" 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-28T22:41:14.874622" elapsed="0.000091"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.874829" 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-28T22:41:14.874755" elapsed="0.000090"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.874989" 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-28T22:41:14.874901" elapsed="0.000109"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.875174" 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-28T22:41:14.875091" elapsed="0.000098"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.875313" 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-28T22:41:14.875230" elapsed="0.000104"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.875471" 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-28T22:41:14.875382" elapsed="0.000106"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:14.874161" elapsed="0.001342"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:14.873442" elapsed="0.002070"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.875622" 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-28T22:41:14.875553" elapsed="0.000088"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:14.875847" 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-28T22:41:14.875688" elapsed="0.000277"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:14.873246" elapsed="0.002754"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.876088" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:14.876048" elapsed="0.000059"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:14.872279" elapsed="0.003852"/>
</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-28T22:41:14.876727" elapsed="0.000115"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.876980" 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-28T22:41:14.876895" elapsed="0.000097"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.877169" 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-28T22:41:14.877043" elapsed="0.000140"/>
</kw>
<if>
<branch type="IF" condition="'${access_token}' == '${EMPTY}' or '${refresh_token}' == '${EMPTY}'">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.877785" 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-28T22:41:14.877708" elapsed="0.000088"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.877917" 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-28T22:41:14.877842" elapsed="0.000086"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-28T22:41:14.878147" 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-28T22:41:14.878028" elapsed="0.000151">File '/Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_bitradex_test.json' does not exist.</status>
</kw>
<msg time="2026-05-28T22:41:14.878217" 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-28T22:41:14.877973" elapsed="0.000254"/>
</kw>
<if>
<branch type="IF" condition="not ${token_file_exists}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.878383" 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-28T22:41:14.878322" elapsed="0.000071"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-28T22:41:14.878579" 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-28T22:41:14.878502" elapsed="0.000100">File '/Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_bitradex_test.json' does not exist.</status>
</kw>
<msg time="2026-05-28T22:41:14.878636" 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-28T22:41:14.878444" elapsed="0.000202"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:14.878256" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:14.878249" elapsed="0.000422"/>
</if>
<if>
<branch type="IF" condition="not ${token_file_exists}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.878818" 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-28T22:41:14.878754" elapsed="0.000074"/>
</kw>
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-28T22:41:14.878939" 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-28T22:41:14.878867" elapsed="0.000092"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:14.878692" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:14.878685" elapsed="0.000313"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-28T22:41:14.879105" 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-28T22:41:14.880169" 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-28T22:41:14.879049" elapsed="0.001241"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.880821" 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-28T22:41:14.880490" elapsed="0.000353"/>
</kw>
<if>
<branch type="IF" condition="'${access_token}' == '${EMPTY}'">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:14.881385" 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-28T22:41:14.881277" elapsed="0.000122"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:14.880904" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:14.880888" elapsed="0.000543"/>
</if>
<if>
<branch type="IF" condition="'${refresh_token}' == '${EMPTY}'">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:14.881932" 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-28T22:41:14.881740" elapsed="0.000205"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:14.881493" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:14.881484" elapsed="0.000496"/>
</if>
<status status="PASS" start="2026-05-28T22:41:14.877224" elapsed="0.004766"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:14.877214" elapsed="0.004784"/>
</if>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.882106" 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-28T22:41:14.882042" elapsed="0.000084"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.882225" 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-28T22:41:14.882172" elapsed="0.000072"/>
</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-28T22:41:14.882300" elapsed="0.000076"/>
</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-28T22:41:14.882430" elapsed="0.000060"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.882609" 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-28T22:41:14.882541" elapsed="0.000079"/>
</kw>
<if>
<branch type="IF" condition="'${user_id}' == '${EMPTY}'">
<kw name="Split String" owner="String">
<msg time="2026-05-28T22:41:14.882971" 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-28T22:41:14.882889" elapsed="0.000094"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.883282" 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-28T22:41:14.883032" elapsed="0.000263"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.883624" 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-28T22:41:14.883344" elapsed="0.000295"/>
</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-28T22:41:14.883771" elapsed="0.000073"/>
</kw>
<msg time="2026-05-28T22:41:14.883882" 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-28T22:41:14.883699" elapsed="0.000194"/>
</kw>
<if>
<branch type="IF" condition="${has_user_id}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.884246" 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-28T22:41:14.883992" elapsed="0.000266"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:14.883928" elapsed="0.000346"/>
</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-28T22:41:14.884330" elapsed="0.000009"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:14.884285" elapsed="0.000069"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:14.883920" elapsed="0.000443"/>
</if>
<status status="PASS" start="2026-05-28T22:41:14.882652" elapsed="0.001721"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:14.882644" elapsed="0.001766"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.884537" 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-28T22:41:14.884455" elapsed="0.000093"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.884717" 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-28T22:41:14.884598" elapsed="0.000131"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:14.885451" 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-28T22:41:14.885084" elapsed="0.000382"/>
</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-28T22:41:14.885867" elapsed="0.000111"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:14.885523" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:14.885513" elapsed="0.000493"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:14.886021" elapsed="0.000017"/>
</return>
<msg time="2026-05-28T22:41:14.886112" 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-28T22:41:14.884855" elapsed="0.001268"/>
</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-28T22:41:14.886171" elapsed="0.000070"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:15.153769" 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-28T22:41:15.154113" 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 14:41: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-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'ef607cf1424b7fe0096f19fae1413a3d', 'X-Transparent': '00-ef607cf1424b7fe0096f19fae1413a3d-c6990d72b9517e87-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.003', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02e04e5399806a5-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":401,"msg":"登录失效，请重试","msgInfo":{"template":"Token expire."},"ts":1779979275115} 
 </msg>
<msg time="2026-05-28T22:41:15.154285" 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-28T22:41:15.154606" 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-28T22:41:14.886285" elapsed="0.268379"/>
</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-28T22:41:15.155409" elapsed="0.000666"/>
</kw>
<msg time="2026-05-28T22:41:15.156180" 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-28T22:41:15.155155" elapsed="0.001055"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.157709" 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-28T22:41:15.156433" elapsed="0.001344"/>
</kw>
<if>
<branch type="IF" condition="${has_code}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.159092" 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-28T22:41:15.158317" elapsed="0.000821"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:15.157976" elapsed="0.001220"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:15.157922" elapsed="0.001317"/>
</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-28T22:41:15.162711" 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-28T22:41:15.162113" elapsed="0.000765"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.167542" 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-28T22:41:15.166250" elapsed="0.001390"/>
</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-28T22:41:15.169031" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:15.167982" elapsed="0.001158"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:15.167913" elapsed="0.001262"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:15.169232" elapsed="0.000063"/>
</return>
<msg time="2026-05-28T22:41:15.169611" 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-28T22:41:15.164809" elapsed="0.004833"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:15.285350" 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-28T22:41:15.285645" 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 14:41:15 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': 'f369802a2cb2fa11c370b7cb5367a48a', 'X-Transparent': '00-f369802a2cb2fa11c370b7cb5367a48a-733b123f5a34363e-01', 'X-Upstream-Addr': '10.9.160.119:8080', 'X-Upstream-Header-Time': '0.009', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': 'a02e04e62c8a06a5-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779979275274} 
 </msg>
<msg time="2026-05-28T22:41:15.285770" 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-28T22:41:15.286061" 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-28T22:41:15.169851" elapsed="0.116241"/>
</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-28T22:41:15.288805" elapsed="0.000071"/>
</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-28T22:41:15.289087" elapsed="0.000028"/>
</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-28T22:41:15.289223" elapsed="0.000016"/>
</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-28T22:41:15.289420" elapsed="0.000033"/>
</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-28T22:41:15.289567" elapsed="0.000019"/>
</kw>
<kw name="获取统一请求头" owner="common">
<var>${new_headers}</var>
<arg>token=${new_access_token}</arg>
<doc>获取统一的应用请求头配置</doc>
<status status="NOT RUN" start="2026-05-28T22:41:15.289909" elapsed="0.000050"/>
</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-28T22:41:15.290111" elapsed="0.000024"/>
</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-28T22:41:15.290456" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:15.290319" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-05-28T22:41:15.290246" elapsed="0.000307"/>
</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-28T22:41:15.290701" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:15.290609" elapsed="0.000152"/>
</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-28T22:41:15.290864" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:15.290784" elapsed="0.000138"/>
</branch>
<status status="NOT RUN" start="2026-05-28T22:41:15.290594" elapsed="0.000348"/>
</if>
<return>
<value>${final_resp}</value>
<status status="NOT RUN" start="2026-05-28T22:41:15.290980" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-05-28T22:41:15.286396" elapsed="0.004638"/>
</branch>
<branch type="ELSE">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.292179" level="FAIL">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779979275274}</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-28T22:41:15.291131" elapsed="0.001252">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779979275274}</status>
</kw>
<status status="FAIL" start="2026-05-28T22:41:15.291054" elapsed="0.001565">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779979275274}</status>
</branch>
<status status="FAIL" start="2026-05-28T22:41:15.286318" elapsed="0.006464">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779979275274}</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-28T22:41:15.160711" elapsed="0.132364">Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779979275274}</status>
</kw>
<msg time="2026-05-28T22:41:15.293433" level="INFO">${refresh_status} = FAIL</msg>
<msg time="2026-05-28T22:41:15.293539" level="INFO">${refresh_result} = Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779979275274}</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-28T22:41:15.160090" elapsed="0.133493"/>
</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-28T22:41:15.294314" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:15.293791" elapsed="0.000586"/>
</branch>
<branch type="ELSE">
<kw name="Skip" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.294977" level="SKIP">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779979275274}</msg>
<arg>Token已失效且refreshToken不可用: ${refresh_result}</arg>
<doc>Skips the rest of the current test.</doc>
<status status="SKIP" start="2026-05-28T22:41:15.294493" elapsed="0.000723">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779979275274}</status>
</kw>
<status status="SKIP" start="2026-05-28T22:41:15.294407" elapsed="0.001016">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779979275274}</status>
</branch>
<status status="SKIP" start="2026-05-28T22:41:15.293737" elapsed="0.001770">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779979275274}</status>
</if>
<status status="SKIP" start="2026-05-28T22:41:15.159332" elapsed="0.136292">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779979275274}</status>
</branch>
<status status="SKIP" start="2026-05-28T22:41:15.159302" elapsed="0.136382">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779979275274}</status>
</if>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:41:15.296145" elapsed="0.000221"/>
</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-28T22:41:15.296748" elapsed="0.000035"/>
</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-28T22:41:15.296946" elapsed="0.000035"/>
</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-28T22:41:15.297104" elapsed="0.000018"/>
</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-28T22:41:15.297366" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:15.297229" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-05-28T22:41:15.297198" elapsed="0.000276"/>
</if>
<kw name="验证响应字段值" owner="common">
<arg>${response}</arg>
<arg>code</arg>
<arg>${0}</arg>
<doc>验证响应JSON字段的值</doc>
<status status="NOT RUN" start="2026-05-28T22:41:15.297802" elapsed="0.000041"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T22:41:15.297997" elapsed="0.000025"/>
</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-28T22:41:15.298160" elapsed="0.000021"/>
</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-28T22:41:15.298386" elapsed="0.000031"/>
</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-28T22:41:15.298519" elapsed="0.000018"/>
</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-28T22:41:15.298622" elapsed="0.000017"/>
</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-28T22:41:15.298729" elapsed="0.000016"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T22:41:15.298925" elapsed="0.000029"/>
</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-28T22:41:15.299086" elapsed="0.000018"/>
</kw>
<doc>验证获取用户收益信息接口功能</doc>
<tag>invite</tag>
<tag>profit</tag>
<status status="SKIP" start="2026-05-28T22:41:14.876171" elapsed="0.423177">Token已失效且refreshToken不可用: Token刷新失败: {"code":909,"msg":"refreshToken错误","msgInfo":{"template":"refreshToken错误"},"ts":1779979275274}</status>
</test>
<doc>用户及团队收益分析-获取用户收益信息</doc>
<status status="SKIP" start="2026-05-28T22:41:14.869810" elapsed="0.429973"/>
</suite>
<status status="SKIP" start="2026-05-28T22:41:14.869033" elapsed="0.432416"/>
</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-28T22:41:15.311405" 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-28T22:41:15.310929" elapsed="0.000549"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.312459" 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-28T22:41:15.312060" elapsed="0.000637"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:15.311666" elapsed="0.001133"/>
</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-28T22:41:15.313221" elapsed="0.000346"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:15.312849" elapsed="0.000976"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:15.311614" elapsed="0.002270"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.315339" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:15.315126" elapsed="0.000282"/>
</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-28T22:41:15.315751" elapsed="0.000026"/>
</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-28T22:41:15.315901" 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-28T22:41:15.316036" 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-28T22:41:15.316167" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:15.316290" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:15.315517" elapsed="0.000826"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:15.316553" 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-28T22:41:15.316778" elapsed="0.000023"/>
</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-28T22:41:15.316914" 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-28T22:41:15.317038" 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-28T22:41:15.317155" elapsed="0.000029"/>
</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-28T22:41:15.317272" 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-28T22:41:15.317374" 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-28T22:41:15.317474" 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-28T22:41:15.317578" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:15.316370" elapsed="0.001250"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.317997" 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-28T22:41:15.317732" elapsed="0.000312"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.318353" 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-28T22:41:15.318148" elapsed="0.000245"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.318686" 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-28T22:41:15.318496" elapsed="0.000229"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.319021" 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-28T22:41:15.318824" elapsed="0.000235"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.319416" 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-28T22:41:15.319159" elapsed="0.000321"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.319873" 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-28T22:41:15.319618" elapsed="0.000299"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.320251" 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-28T22:41:15.320029" elapsed="0.000260"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.320597" 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-28T22:41:15.320394" elapsed="0.000240"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.320942" 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-28T22:41:15.320733" elapsed="0.000247"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:15.317643" elapsed="0.003371"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:15.315487" elapsed="0.005549"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.321305" 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-28T22:41:15.321138" elapsed="0.000212"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:15.322033" 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-28T22:41:15.321451" elapsed="0.000930"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:15.314431" elapsed="0.008056"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.322757" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:15.322628" elapsed="0.000178"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:15.310362" elapsed="0.012503"/>
</kw>
<test id="s1-s4-s1-s1-t1" name="获取余额货币列表" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.324374" 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-28T22:41:15.324139" elapsed="0.000265"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.326043" 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-28T22:41:15.325482" elapsed="0.000589"/>
</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-28T22:41:15.326788" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:15.326255" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:15.326229" elapsed="0.000638"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:15.326902" elapsed="0.000048"/>
</return>
<msg time="2026-05-28T22:41:15.327102" 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-28T22:41:15.324727" elapsed="0.002401"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:15.678543" 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-28T22:41:15.679141" 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 14:41: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-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '85a1a27447144b86854292a9fde4ad6f', 'X-Transparent': '00-85a1a27447144b86854292a9fde4ad6f-14c1fdee5f679566-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': 'a02e04e80b6fdd4b-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":1779979275573} 
 </msg>
<msg time="2026-05-28T22:41:15.679405" 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-28T22:41:15.679643" 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-28T22:41:15.327224" elapsed="0.352546"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.681008" 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-28T22:41:15.680095" elapsed="0.001064"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.682569" 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-28T22:41:15.681503" elapsed="0.001110"/>
</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-28T22:41:15.682887" elapsed="0.000421"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.684911" 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-28T22:41:15.683582" elapsed="0.001395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.685598" 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": 1779979275573
}</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-28T22:41:15.685233" elapsed="0.000701"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:15.687190" 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-28T22:41:15.686128" elapsed="0.001124"/>
</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-28T22:41:15.687609" elapsed="0.002821"/>
</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-28T22:41:15.690814" elapsed="0.000393"/>
</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-28T22:41:15.692931" elapsed="0.000453"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T22:41:15.694338" 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-28T22:41:15.693608" elapsed="0.000817"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.695287" 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-28T22:41:15.694901" elapsed="0.000466"/>
</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-28T22:41:15.695951" elapsed="0.000240"/>
</kw>
<msg time="2026-05-28T22:41:15.696299" 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-28T22:41:15.695630" elapsed="0.000694"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:15.696815" 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-28T22:41:15.696594" elapsed="0.000319">Dictionary does not contain key 'symbols'.</status>
</kw>
<msg time="2026-05-28T22:41:15.697018" 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-28T22:41:15.696459" elapsed="0.000585"/>
</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-28T22:41:15.697282" elapsed="0.000121"/>
</kw>
<msg time="2026-05-28T22:41:15.697473" 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-28T22:41:15.697165" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:15.697975" 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-28T22:41:15.697734" elapsed="0.000352">Dictionary does not contain key 'timestamp'.</status>
</kw>
<msg time="2026-05-28T22:41:15.698207" 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-28T22:41:15.697608" elapsed="0.000622"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:15.699151" 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-28T22:41:15.698849" elapsed="0.000397">Dictionary does not contain key 'count'.</status>
</kw>
<msg time="2026-05-28T22:41:15.699367" 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-28T22:41:15.698473" elapsed="0.000918"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.699758" 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-28T22:41:15.699536" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.700200" 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-28T22:41:15.700078" elapsed="0.000160"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.700452" 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-28T22:41:15.700343" elapsed="0.000145"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.700683" 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-28T22:41:15.700577" elapsed="0.000141"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.700902" 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-28T22:41:15.700800" elapsed="0.000135"/>
</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-28T22:41:15.702212" elapsed="0.000385"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.703248" level="INFO">Length is 29.</msg>
<msg time="2026-05-28T22:41:15.703357" 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-28T22:41:15.702973" elapsed="0.000406"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.703864" level="INFO">货币列表包含 29 种货币</msg>
<arg>货币列表包含 ${list_length} 种货币</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:15.703602" elapsed="0.000337"/>
</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-28T22:41:15.705535" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.706173" 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-28T22:41:15.705984" elapsed="0.000248"/>
</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-28T22:41:15.706525" elapsed="0.000168"/>
</kw>
<msg time="2026-05-28T22:41:15.706794" 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-28T22:41:15.706366" elapsed="0.000455"/>
</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-28T22:41:15.707094" elapsed="0.000159"/>
</kw>
<msg time="2026-05-28T22:41:15.707347" 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-28T22:41:15.706950" elapsed="0.000425"/>
</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-28T22:41:15.707622" elapsed="0.000130"/>
</kw>
<msg time="2026-05-28T22:41:15.707832" 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-28T22:41:15.707499" elapsed="0.000356"/>
</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-28T22:41:15.708081" elapsed="0.000128"/>
</kw>
<msg time="2026-05-28T22:41:15.708285" 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-28T22:41:15.707960" elapsed="0.000347"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.708546" 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-28T22:41:15.708409" elapsed="0.000161"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:15.708987" 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-28T22:41:15.708790" elapsed="0.000275">Dictionary does not contain key 'contractAddress'.</status>
</kw>
<msg time="2026-05-28T22:41:15.709150" 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-28T22:41:15.708670" elapsed="0.000502"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:15.709559" 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-28T22:41:15.709407" elapsed="0.000203">Dictionary does not contain key 'withdrawFee'.</status>
</kw>
<msg time="2026-05-28T22:41:15.709691" 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-28T22:41:15.709279" elapsed="0.000434"/>
</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-28T22:41:15.709940" elapsed="0.000129"/>
</kw>
<msg time="2026-05-28T22:41:15.710146" 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-28T22:41:15.709819" elapsed="0.000349"/>
</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-28T22:41:15.710395" elapsed="0.000131"/>
</kw>
<msg time="2026-05-28T22:41:15.710604" 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-28T22:41:15.710273" elapsed="0.000352"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:15.711085" 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-28T22:41:15.710933" elapsed="0.000203">Dictionary does not contain key 'networkList'.</status>
</kw>
<msg time="2026-05-28T22:41:15.711217" 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-28T22:41:15.710729" elapsed="0.000510"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:15.711779" 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-28T22:41:15.711475" elapsed="0.000357">Dictionary does not contain key 'isMarginTradingAllowed'.</status>
</kw>
<msg time="2026-05-28T22:41:15.711919" 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-28T22:41:15.711348" elapsed="0.000593"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:15.712317" 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-28T22:41:15.712166" elapsed="0.000201">Dictionary does not contain key 'isDebitEnabled'.</status>
</kw>
<msg time="2026-05-28T22:41:15.712448" 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-28T22:41:15.712045" 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-28T22:41:15.713056" 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-28T22:41:15.712848" elapsed="0.000274">Dictionary does not contain key 'debitEnabled'.</status>
</kw>
<msg time="2026-05-28T22:41:15.713224" 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-28T22:41:15.712661" elapsed="0.000589"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:15.713726" 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-28T22:41:15.713551" elapsed="0.000232">Dictionary does not contain key 'ipoPurchasingAllowed'.</status>
</kw>
<msg time="2026-05-28T22:41:15.713875" 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-28T22:41:15.713406" elapsed="0.000492"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:15.714314" 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-28T22:41:15.714151" elapsed="0.000215">Dictionary does not contain key 'ipoSellingAllowed'.</status>
</kw>
<msg time="2026-05-28T22:41:15.714453" 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-28T22:41:15.714019" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:15.714873" 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-28T22:41:15.714714" elapsed="0.000210">Dictionary does not contain key 'isLegalMoney'.</status>
</kw>
<msg time="2026-05-28T22:41:15.715007" 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-28T22:41:15.714586" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:15.715422" 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-28T22:41:15.715268" elapsed="0.000198">Dictionary does not contain key 'trading'.</status>
</kw>
<msg time="2026-05-28T22:41:15.715538" 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-28T22:41:15.715138" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.715761" 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-28T22:41:15.715649" elapsed="0.000150"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.715993" 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-28T22:41:15.715887" elapsed="0.000140"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.716212" 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-28T22:41:15.716111" elapsed="0.000137"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.716428" 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-28T22:41:15.716328" elapsed="0.000179"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.716693" 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-28T22:41:15.716595" elapsed="0.000133"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.716924" 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-28T22:41:15.716821" elapsed="0.000136"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.717141" 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-28T22:41:15.717039" elapsed="0.000138"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.717485" 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-28T22:41:15.717257" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.717712" 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-28T22:41:15.717607" elapsed="0.000141"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.717929" 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-28T22:41:15.717830" elapsed="0.000134"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.718151" 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-28T22:41:15.718046" elapsed="0.000139"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.718369" 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-28T22:41:15.718265" elapsed="0.000139"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.718585" 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-28T22:41:15.718486" elapsed="0.000134"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.718806" 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-28T22:41:15.718704" elapsed="0.000136"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.719026" 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-28T22:41:15.718922" elapsed="0.000139"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.719239" 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-28T22:41:15.719141" elapsed="0.000133"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.719455" 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-28T22:41:15.719357" elapsed="0.000131"/>
</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-28T22:41:15.720669" elapsed="0.000395"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.721363" 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-28T22:41:15.721232" elapsed="0.000170"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.721593" level="INFO">货币符号: btc</msg>
<arg>货币符号: ${symbol}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:15.721489" elapsed="0.000140"/>
</kw>
<arg>${currency_item['currency']}</arg>
<doc>验证货币符号格式</doc>
<status status="PASS" start="2026-05-28T22:41:15.719801" elapsed="0.001880"/>
</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-28T22:41:15.719578" elapsed="0.002143"/>
</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-28T22:41:15.722593" elapsed="0.000215"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.723011" 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-28T22:41:15.722898" elapsed="0.000149"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.723227" level="INFO">货币名称: BTC</msg>
<arg>货币名称: ${name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:15.723133" elapsed="0.000126"/>
</kw>
<arg>${currency_item['displayName']}</arg>
<doc>验证货币名称格式</doc>
<status status="PASS" start="2026-05-28T22:41:15.721998" elapsed="0.001300"/>
</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-28T22:41:15.721817" elapsed="0.001514"/>
</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-28T22:41:15.724033" elapsed="0.000190"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${precision} &gt;= 0</arg>
<arg>精度应该是非负数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-05-28T22:41:15.724303" elapsed="0.000178"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.724724" level="INFO">货币精度: 8</msg>
<arg>货币精度: ${precision}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:15.724562" elapsed="0.000194"/>
</kw>
<arg>${currency_item['maxPrecision']}</arg>
<doc>验证货币精度格式</doc>
<status status="PASS" start="2026-05-28T22:41:15.723561" elapsed="0.001236"/>
</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-28T22:41:15.723413" elapsed="0.001416"/>
</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-28T22:41:15.725553" elapsed="0.000184"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.725912" level="INFO">充值状态: 1</msg>
<arg>充值状态: ${deposit_status}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:15.725818" elapsed="0.000127"/>
</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-28T22:41:15.726023" elapsed="0.000117"/>
</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-28T22:41:15.726382" elapsed="0.000152"/>
</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-28T22:41:15.726229" elapsed="0.000344"/>
</kw>
<arg>${currency_item['depositStatus']}</arg>
<doc>验证充值状态值</doc>
<status status="PASS" start="2026-05-28T22:41:15.725076" elapsed="0.001542"/>
</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-28T22:41:15.724911" elapsed="0.001737"/>
</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-28T22:41:15.727353" elapsed="0.000176"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.727703" level="INFO">提现状态: 1</msg>
<arg>提现状态: ${withdraw_status}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:15.727609" elapsed="0.000252"/>
</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-28T22:41:15.727941" elapsed="0.000120"/>
</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-28T22:41:15.728305" elapsed="0.000150"/>
</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-28T22:41:15.728150" elapsed="0.000343"/>
</kw>
<arg>${currency_item['withdrawStatus']}</arg>
<doc>验证提现状态值</doc>
<status status="PASS" start="2026-05-28T22:41:15.726887" elapsed="0.001649"/>
</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-28T22:41:15.726733" elapsed="0.001835"/>
</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-28T22:41:15.728647" elapsed="0.000083"/>
</kw>
<arg>${currency_list[0]}</arg>
<doc>验证单个货币的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:15.704665" elapsed="0.024111"/>
</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-28T22:41:15.704109" elapsed="0.024706"/>
</kw>
<arg>${currency_dict['currencies']}</arg>
<doc>验证货币列表的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:15.701273" elapsed="0.027585"/>
</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-28T22:41:15.701031" elapsed="0.027861"/>
</kw>
<arg>${data}</arg>
<doc>验证货币字典的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:15.692069" elapsed="0.036868"/>
</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-28T22:41:15.691445" elapsed="0.037527"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.729415" 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-28T22:41:15.729061" elapsed="0.000390"/>
</kw>
<doc>验证余额货币列表接口功能</doc>
<tag>spot</tag>
<status status="PASS" start="2026-05-28T22:41:15.322943" elapsed="0.406639"/>
</test>
<doc>余额货币列表接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:15.305882" elapsed="0.424001"/>
</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-28T22:41:15.733752" 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-28T22:41:15.733605" elapsed="0.000167"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.734053" 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-28T22:41:15.733968" elapsed="0.000115"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:15.733833" elapsed="0.000293"/>
</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-28T22:41:15.734213" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:15.734145" elapsed="0.000101"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:15.733815" elapsed="0.000444"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.734696" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:15.734614" elapsed="0.000113"/>
</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-28T22:41:15.734881" 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-28T22:41:15.734965" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:15.735044" elapsed="0.000012"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:15.735114" 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-28T22:41:15.735183" elapsed="0.000011"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:15.734771" elapsed="0.000442"/>
</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-28T22:41:15.735329" 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-28T22:41:15.735408" 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-28T22:41:15.735476" elapsed="0.001353"/>
</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-28T22:41:15.736896" 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-28T22:41:15.736969" 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-28T22:41:15.737035" 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-28T22:41:15.737109" 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-28T22:41:15.737177" 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-28T22:41:15.737241" elapsed="0.000011"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:15.735226" elapsed="0.002044"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.737475" 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-28T22:41:15.737337" elapsed="0.000164"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.737687" 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-28T22:41:15.737563" elapsed="0.000149"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.737900" 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-28T22:41:15.737776" elapsed="0.000148"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.738110" 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-28T22:41:15.737987" elapsed="0.000147"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.738324" 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-28T22:41:15.738198" elapsed="0.000150"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.738532" 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-28T22:41:15.738411" elapsed="0.000145"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.738753" 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-28T22:41:15.738619" elapsed="0.000158"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.738968" 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-28T22:41:15.738840" elapsed="0.000152"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.739187" 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-28T22:41:15.739055" elapsed="0.000156"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:15.737283" elapsed="0.001949"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:15.734759" elapsed="0.004516"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.739431" 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-28T22:41:15.739335" elapsed="0.000123"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:15.739723" 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-28T22:41:15.739521" elapsed="0.000320"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:15.734439" elapsed="0.005443"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.739996" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:15.739944" elapsed="0.000077"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:15.733443" elapsed="0.006608"/>
</kw>
<test id="s1-s4-s1-s2-t1" name="获取货币价格转换" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.740909" 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-28T22:41:15.740784" elapsed="0.000142"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:15.741892" 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-28T22:41:15.741500" elapsed="0.000413"/>
</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-28T22:41:15.742289" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:15.741987" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:15.741976" elapsed="0.000363"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:15.742360" elapsed="0.000026"/>
</return>
<msg time="2026-05-28T22:41:15.742488" 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-28T22:41:15.741048" elapsed="0.001456"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:16.082955" 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-28T22:41:16.083164" 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 14:41: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-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '5bc555af246622197445a0310caffdc5', 'X-Transparent': '00-5bc555af246622197445a0310caffdc5-8f4ab35018eb0c07-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': 'a02e04eab90a85ca-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"uft":{"btc":"0.00000012769011875037571741401972","usd":"0.0088843354414123616","usdt":"0.0089"},"ksm":{"btc":"0.00006312769915748911872153783666","usd":"4.3922557238443136","usdt":"4.4"},"vanry":{"btc":"0.00000006516500217575354028027838","usd":"0.004534005794932016448","usdt":"0.004542"},"pyth":{"btc":"0.00000054949792675723482887156799","usd":"0.0382325895961902752","usdt":"0.0383"},"bal":{"btc":"0.00001387374661029363131902888365","usd":"0.965298019308511648","usdt":"0.967"},"fio":{"btc":"0.00000001348637209273631172687399","usd":"0.00093834554100310336","usdt":"0.00094"},"mbox":{"btc":"0.00000015208036615213287692006842","usd":"0.0105813433347158464","usdt":"0.0106"},"theta":{"btc":"0.00000259684398806943874740871555","usd":"0.180681428639959264","usdt":"0.181"},"vib":{"btc":"0.00000003199426570936380335205213","usd":"0.00222607506003927712","usdt":"0.00223"},"fis":{"btc":"0.00000027403160316091867445031197","usd":"0.0190663828012332704","usdt":"0.0191"},"vic":{"btc":"0.00000058823537851296678808705711","usd":"0.040927837426731104","usdt":"0.041"},"bar":{"btc":"0.00000517934077178490269510799069","usd":"0.360364617342681184","usdt":"0.361"},"stpt":{"btc":"0.00000101033013060690539553879419","usd":"0.07029605638025376448","usdt":"0.07042"},"rad":{"btc":"0.00000365853711026357392590730644","usd":"0.25455118399552272","usdt":"0.255"},"bat":{"btc":"0.00000153228142500450860896823658","usd":"0.1066120252969483392","usdt":"0.1068"},"cake":{"btc":"0.00001913917060820238281239351684","usd":"1.331652076274616896","usdt":"1.334"},"ssv":{"btc":"0.00003365854141442488011834721928","usd":"2.341870892758809024","usdt":"2.346"},"ape":{"btc":"0.00000177474917858668272405777964","usd":"0.1234822802362594528","usdt":"0.1237"},"qi":{"btc":"0.00000002123386244388270356997182","usd":"0.00147739510711126912","usdt":"0.00148"},"farm":{"btc":"0.00008321378525305383831475442106","usd":"5.7897916359765952","usdt":"5.8"},"ctk":{"btc":"0.0000021377334487422451567066222","usd":"0.148737750648364256","usdt":"0.149"},"band":{"btc":"0.00000268292721419328754566535806","usd":"0.186670868263383328","usdt":"0.187"},"iotx":{"btc":"0.00000005624104106758121486100644","usd":"0.00391310055397038848","usdt":"0.00392"},"near":{"btc":"0.00007562411414980116926846044022","usd":"5.261722709178040224","usdt":"5.271"},"shib":{"btc":"0.00000000012209470905232554552733","usd":"0.00000849502186588979744","usdt":"0.00000851"},"xmr":{"btc":"0.00170301315681680872551057754815","usd":"118.4910805500727328","usdt":"118.7"},"dock":{"btc":"0.00000005595409698050171886681763","usd":"0.0038931357552256416","usdt":"0.0039"},"astr":{"btc":"0.00000010225252543077839752918185","usd":"0.007114456032690550688","usdt":"0.007127"},"waves":{"btc":"0.00001543759188487688448735788915","usd":"1.074106172467382144","usdt":"1.076"},"reef":{"btc":"0.00000000987087659553466220009501","usd":"0.000686789076819292672","usdt":"0.000688"},"iris":{"btc":"0.00000007474893468420870648618457","usd":"0.00520083007300656224","usdt":"0.00521"},"apt":{"btc":"0.00001315638639259489133355686278","usd":"0.915386022446644448","usdt":"0.917"},"stg":{"btc":"0.00000219655698659354183551532791","usd":"0.1528305343910373664","usdt":"0.1531"},"ai":{"btc":"0.00000033859402275380527314279385","usd":"0.0235584625188013184","usdt":"0.0236"},"combo":{"btc":"0.00000039598284016970447198055552","usd":"0.0275514222677506944","usdt":"0.0276"},"dent":{"btc":"0.00000000054519376545104238895874","usd":"0.000037933117615019072","usdt":"0.000038"},"kda":{"btc":"0.0000000860832261238487982566425","usd":"0.005989439623424064","usdt":"0.006"},"metis":{"btc":"0.00004332855714900389512251006062","usd":"3.01468461045677888","usdt":"3.02"},"glm":{"btc":"0.00000184648520035655672260498172","usd":"0.1284734799224461728","usdt":"0.1287"},"loka":{"btc":"0.00000177474917858668272405777964","usd":"0.1234822802362594528","usdt":"0.1237"},"ray":{"btc":"0.00001008608466084428419573661345","usd":"0.701762675877852832","usdt":"0.703"},"wld":{"btc":"0.0000040832143591412279973067428","usd":"0.2840990861377481024","usdt":"0.2846"},"agld":{"btc":"0.00000305595452739663233811080891","usd":"0.212625106631554272","usdt":"0.213"},"iost":{"btc":"0.00000001431850994526685011002154","usd":"0.000996243457362869312","usdt":"0.000998"},"zro":{"btc":"0.0000160545216720978008748638271","usd":"1.117030489768587936","usdt":"1.119"},"wing":{"btc":"0.00000467718861939578470527757608","usd":"0.325426219539374144","usdt":"0.326"},"dgb":{"btc":"0.00000004619799801979885506439814","usd":"0.00321433259790424768","usdt":"0.00322"},"bb":{"btc":"0.00000038737451755731959215489127","usd":"0.026952478305408288","usdt":"0.027"},"zrx":{"btc":"0.00000142467739234969761114743345","usd":"0.0991252257676682592","usdt":"0.0993"},"sui":{"btc":"0.00001322381825305857289219123274","usd":"0.9200777501516599648","usdt":"0.9217"},"bsw":{"btc":"0.00000016068868876451775674573268","usd":"0.0111802872970582528","usdt":"0.0112"},"omg":{"btc":"0.00000549497926757234828871567987","usd":"0.382325895961902752","usdt":"0.383"},"blur":{"btc":"0.0000002922525526904666700813013","usd":"0.02033414752152469728","usdt":"0.02037"},"jst":{"btc":"0.00000137575342550264354413824163","usd":"0.09572122758168891616","usdt":"0.09589"},"pol":{"btc":"0.00000125925412614836817049758544","usd":"0.08761551929132168288","usdt":"0.08777"},"pivx":{"btc":"0.00000080344344382258878372866338","usd":"0.055901436485291264","usdt":"0.056"},"gmt":{"btc":"0.00000014505023601868522506244262","usd":"0.01009220576546954784","usdt":"0.01011"},"nkn":{"btc":"0.00000010473459178401603787891505","usd":"0.0072871515418326112","usdt":"0.0073"},"porto":{"btc":"0.00000959827971280914100561563926","usd":"0.667822518011783136","usdt":"0.669"},"rsr":{"btc":"0.0000000227546661054040323391725","usd":"0.001583208540458427584","usdt":"0.001586"},"sc":{"btc":"0.00000001246772058360410094750372","usd":"0.000867470505459251936","usdt":"0.000869"},"twt":{"btc":"0.00000631850879749050179203755983","usd":"0.4396248683593262976","usdt":"0.4404"},"arb":{"btc":"0.00000146054540323463461042103449","usd":"0.1016208256107616192","usdt":"0.1018"},"btc":{"btc":"1","usd":"69577.31364304350442656","usdt":"69699.99"},"cvc":{"btc":"0.00000038780493368793883614617448","usd":"0.02698242550352540832","usdt":"0.02703"},"ardr":{"btc":"0.00000050545200939053219376358591","usd":"0.03516799298887162912","usdt":"0.03523"},"vite":{"btc":"0.00000001233859574441832775011876","usd":"0.00085848634602411584","usdt":"0.00086"},"gmx":{"btc":"0.00008737447451570653023049214211","usd":"6.07928121777542496","usdt":"6.09"},"sei":{"btc":"0.00000097991405737647882015478051","usd":"0.0681797877133105952","usdt":"0.0683"},"matic":{"btc":"0.00000544332933189803900976169437","usd":"0.3787322321878483136","usdt":"0.3794"},"audio":{"btc":"0.00000026370161602605681865951487","usd":"0.01834765004642238272","usdt":"0.01838"},"ark":{"btc":"0.00000207460574958475603798508436","usd":"0.1443454949245199424","usdt":"0.1446"},"cvp":{"btc":"0.00000048637022759974571015003015","usd":"0.0338403338723459616","usdt":"0.0339"},"key":{"btc":"0.00000001797704705553042403592884","usd":"0.001250794641358392032","usdt":"0.001253"},"btt":{"btc":"0","usd":"0","usdt":"0"},"cvx":{"btc":"0.00002160688975708604836241726864","usd":"1.503349345479440064","usdt":"1.506"},"flm":{"btc":"0.00000023959831271137915514765497","usd":"0.0166706069518636448","usdt":"0.0167"},"one":{"btc":"0.00000002539455170653539548570954","usd":"0.00176688468891009888","usdt":"0.00177"},"btx":{"btc":"0.00000258106206328006646772833109","usd":"0.1795833647089981856","usdt":"0.1799"},"ong":{"btc":"0.00000087460557741830379028748785","usd":"0.06085270657398849024","usdt":"0.06096"},"gno":{"btc":"0.00161434743390924446330623576847","usd":"112.32195773794594688","usdt":"112.52"},"storj":{"btc":"0.00000140602602668953037152516091","usd":"0.097827513849259712","usdt":"0.098"},"gns":{"btc":"0.00000662840841153635746576147285","usd":"0.461186851003652928","usdt":"0.462"},"people":{"btc":"0.00000008823530677694501821305857","usd":"0.0061391756140096656","usdt":"0.00615"},"tnsr":{"btc":"0.00000050358687282451546980135865","usd":"0.0350382217970307744","usdt":"0.0351"},"bttc":{"btc":"0.00000000000444763334973218790993","usd":"0.00000030945438054357664","usdt":"0.00000031"},"vtho":{"btc":"0.00000000675753325072213066314644","usd":"0.000470171010438789024","usdt":"0.000471"},"polyx":{"btc":"0.00000069296997029698282596597216","usd":"0.0482149889685637152","usdt":"0.0483"},"t":{"btc":"0.00000006771880455076105462855877","usd":"0.00471169250376026368","usdt":"0.00472"},"ont":{"btc":"0.00000074160699305695739698097518","usd":"0.05159902235579831136","usdt":"0.05169"},"mana":{"btc":"0.00000118794852050911341594166656","usd":"0.0826542668032520832","usdt":"0.0828"},"cfx":{"btc":"0.00000073615505540244697309138782","usd":"0.05121969117964812064","usdt":"0.05131"},"w":{"btc":"0.00000015925396832912027677478863","usd":"0.0110804633033345184","usdt":"0.0111"},"dodo":{"btc":"0.00000025652801384906941880479466","usd":"0.01784853007780371072","usdt":"0.01788"},"ankr":{"btc":"0.00000006327117120102886671863224","usd":"0.00440223812321668704","usdt":"0.00441"},"mina":{"btc":"0.00000077761847598543414425167062","usd":"0.0541046045982640448","usdt":"0.0542"},"sfp":{"btc":"0.00000377761890640156476349566191","usd":"0.2628365754745926752","usdt":"0.2633"},"dia":{"btc":"0.00000229411797620057047353952275","usd":"0.1596185659642513056","usdt":"0.1599"},"aca":{"btc":"0.00000002582496783715463947699275","usd":"0.0017968318870272192","usdt":"0.0018"},"algo":{"btc":"0.00000150789117760275144946218787","usd":"0.1049150174036448544","usdt":"0.1051"},"asr":{"btc":"0.0000142467739234969761114743345","usd":"0.991252257676682592","usdt":"0.993"},"df":{"btc":"0.00000002352941514051867152348228","usd":"0.00163711349706924416","usdt":"0.00164"},"ast":{"btc":"0.00000037446203363874227241639489","usd":"0.0260540623618946784","us... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-28T22:41:16.083608" 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-28T22:41:16.083874" 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-28T22:41:15.742567" elapsed="0.341350"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.084874" 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-28T22:41:16.084166" elapsed="0.000834"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.088337" level="INFO">${resp_json} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'uft': {'btc': '0.00000012769011875037571741401972', 'usd': '0.0088843354414123616', 'usdt': '0.0089'}, 'ksm': {'btc': '0.000063127699157489118721...</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-28T22:41:16.085265" elapsed="0.003148"/>
</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-28T22:41:16.088657" elapsed="0.033887"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.125022" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "uft": {
      "btc": "0.00000012769011875037571741401972",
      "usd": "0.0088843354414123616",
      "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-28T22:41:16.122821" elapsed="0.002235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.125382" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "uft": {
      "btc": "0.00000012769011875037571741401972",
      "usd": "0.0088843354414123616",
      "usdt": "0.0089"
    },
    "ksm": {
      "btc": "0.00006312769915748911872153783666",
      "usd": "4.3922557238443136",
      "usdt": "4.4"
    },
    "vanry": {
      "btc": "0.00000006516500217575354028027838",
      "usd": "0.004534005794932016448",
      "usdt": "0.004542"
    },
    "pyth": {
      "btc": "0.00000054949792675723482887156799",
      "usd": "0.0382325895961902752",
      "usdt": "0.0383"
    },
    "bal": {
      "btc": "0.00001387374661029363131902888365",
      "usd": "0.965298019308511648",
      "usdt": "0.967"
    },
    "fio": {
      "btc": "0.00000001348637209273631172687399",
      "usd": "0.00093834554100310336",
      "usdt": "0.00094"
    },
    "mbox": {
      "btc": "0.00000015208036615213287692006842",
      "usd": "0.0105813433347158464",
      "usdt": "0.0106"
    },
    "theta": {
      "btc": "0.00000259684398806943874740871555",
      "usd": "0.180681428639959264",
      "usdt": "0.181"
    },
    "vib": {
      "btc": "0.00000003199426570936380335205213",
      "usd": "0.00222607506003927712",
      "usdt": "0.00223"
    },
    "fis": {
      "btc": "0.00000027403160316091867445031197",
      "usd": "0.0190663828012332704",
      "usdt": "0.0191"
    },
    "vic": {
      "btc": "0.00000058823537851296678808705711",
      "usd": "0.040927837426731104",
      "usdt": "0.041"
    },
    "bar": {
      "btc": "0.00000517934077178490269510799069",
      "usd": "0.360364617342681184",
      "usdt": "0.361"
    },
    "stpt": {
      "btc": "0.00000101033013060690539553879419",
      "usd": "0.07029605638025376448",
      "usdt": "0.07042"
    },
    "rad": {
      "btc": "0.00000365853711026357392590730644",
      "usd": "0.25455118399552272",
      "usdt": "0.255"
    },
    "bat": {
      "btc": "0.00000153228142500450860896823658",
      "usd": "0.1066120252969483392",
      "usdt": "0.1068"
    },
    "cake": {
      "btc": "0.00001913917060820238281239351684",
      "usd": "1.331652076274616896",
      "usdt": "1.334"
    },
    "ssv": {
      "btc": "0.00003365854141442488011834721928",
      "usd": "2.341870892758809024",
      "usdt": "2.346"
    },
    "ape": {
      "btc": "0.00000177474917858668272405777964",
      "usd": "0.1234822802362594528",
      "usdt": "0.1237"
    },
    "qi": {
      "btc": "0.00000002123386244388270356997182",
      "usd": "0.00147739510711126912",
      "usdt": "0.00148"
    },
    "farm": {
      "btc": "0.00008321378525305383831475442106",
      "usd": "5.7897916359765952",
      "usdt": "5.8"
    },
    "ctk": {
      "btc": "0.0000021377334487422451567066222",
      "usd": "0.148737750648364256",
      "usdt": "0.149"
    },
    "band": {
      "btc": "0.00000268292721419328754566535806",
      "usd": "0.186670868263383328",
      "usdt": "0.187"
    },
    "iotx": {
      "btc": "0.00000005624104106758121486100644",
      "usd": "0.00391310055397038848",
      "usdt": "0.00392"
    },
    "near": {
      "btc": "0.00007562411414980116926846044022",
      "usd": "5.261722709178040224",
      "usdt": "5.271"
    },
    "shib": {
      "btc": "0.00000000012209470905232554552733",
      "usd": "0.00000849502186588979744",
      "usdt": "0.00000851"
    },
    "xmr": {
      "btc": "0.00170301315681680872551057754815",
      "usd": "118.4910805500727328",
      "usdt": "118.7"
    },
    "dock": {
      "btc": "0.00000005595409698050171886681763",
      "usd": "0.0038931357552256416",
      "usdt": "0.0039"
    },
    "astr": {
      "btc": "0.00000010225252543077839752918185",
      "usd": "0.007114456032690550688",
      "usdt": "0.007127"
    },
    "waves": {
      "btc": "0.00001543759188487688448735788915",
      "usd": "1.074106172467382144",
      "usdt": "1.076"
    },
    "reef": {
      "btc": "0.00000000987087659553466220009501",
      "usd": "0.000686789076819292672",
      "usdt": "0.000688"
    },
    "iris": {
      "btc": "0.00000007474893468420870648618457",
      "usd": "0.00520083007300656224",
      "usdt": "0.00521"
    },
    "apt": {
      "btc": "0.00001315638639259489133355686278",
      "usd": "0.915386022446644448",
      "usdt": "0.917"
    },
    "stg": {
      "btc": "0.00000219655698659354183551532791",
      "usd": "0.1528305343910373664",
      "usdt": "0.1531"
    },
    "ai": {
      "btc": "0.00000033859402275380527314279385",
      "usd": "0.0235584625188013184",
      "usdt": "0.0236"
    },
    "combo": {
      "btc": "0.00000039598284016970447198055552",
      "usd": "0.0275514222677506944",
      "usdt": "0.0276"
    },
    "dent": {
      "btc": "0.00000000054519376545104238895874",
      "usd": "0.000037933117615019072",
      "usdt": "0.000038"
    },
    "kda": {
      "btc": "0.0000000860832261238487982566425",
      "usd": "0.005989439623424064",
      "usdt": "0.006"
    },
    "metis": {
      "btc": "0.00004332855714900389512251006062",
      "usd": "3.01468461045677888",
      "usdt": "3.02"
    },
    "glm": {
      "btc": "0.00000184648520035655672260498172",
      "usd": "0.1284734799224461728",
      "usdt": "0.1287"
    },
    "loka": {
      "btc": "0.00000177474917858668272405777964",
      "usd": "0.1234822802362594528",
      "usdt": "0.1237"
    },
    "ray": {
      "btc": "0.00001008608466084428419573661345",
      "usd": "0.701762675877852832",
      "usdt": "0.703"
    },
    "wld": {
      "btc": "0.0000040832143591412279973067428",
      "usd": "0.2840990861377481024",
      "usdt": "0.2846"
    },
    "agld": {
      "btc": "0.00000305595452739663233811080891",
      "usd": "0.212625106631554272",
      "usdt": "0.213"
    },
    "iost": {
      "btc": "0.00000001431850994526685011002154",
      "usd": "0.000996243457362869312",
      "usdt": "0.000998"
    },
    "zro": {
      "btc": "0.0000160545216720978008748638271",
      "usd": "1.117030489768587936",
      "usdt": "1.119"
    },
    "wing": {
      "btc": "0.00000467718861939578470527757608",
      "usd": "0.325426219539374144",
      "usdt": "0.326"
    },
    "dgb": {
      "btc": "0.00000004619799801979885506439814",
      "usd": "0.00321433259790424768",
      "usdt": "0.00322"
    },
    "bb": {
      "btc": "0.00000038737451755731959215489127",
      "usd": "0.026952478305408288",
      "usdt": "0.027"
    },
    "zrx": {
      "btc": "0.00000142467739234969761114743345",
      "usd": "0.0991252257676682592",
      "usdt": "0.0993"
    },
    "sui": {
      "btc": "0.00001322381825305857289219123274",
      "usd": "0.9200777501516599648",
      "usdt": "0.9217"
    },
    "bsw": {
      "btc": "0.00000016068868876451775674573268",
      "usd": "0.0111802872970582528",
      "usdt": "0.0112"
    },
    "omg": {
      "btc": "0.00000549497926757234828871567987",
      "usd": "0.382325895961902752",
      "usdt": "0.383"
    },
    "blur": {
      "btc": "0.0000002922525526904666700813013",
      "usd": "0.02033414752152469728",
      "usdt": "0.02037"
    },
    "jst": {
      "btc": "0.00000137575342550264354413824163",
      "usd": "0.09572122758168891616",
      "usdt": "0.09589"
    },
    "pol": {
      "btc": "0.00000125925412614836817049758544",
      "usd": "0.08761551929132168288",
      "usdt": "0.08777"
    },
    "pivx": {
      "btc": "0.00000080344344382258878372866338",
      "usd": "0.055901436485291264",
      "usdt": "0.056"
    },
    "gmt": {
      "btc": "0.00000014505023601868522506244262",
      "usd": "0.01009220576546954784",
      "usdt": "0.01011"
    },
    "nkn": {
      "btc": "0.00000010473459178401603787891505",
      "usd": "0.0072871515418326112",
      "usdt": "0.0073"
    },
    "porto": {
      "btc": "0.00000959827971280914100561563926",
      "usd": "0.667822518011783136",
      "usdt": "0.669"
    },
    "rsr": {
      "btc": "0.0000000227546661054040323391725",
      "usd": "0.001583208540458427584",
      "usdt": "0.001586"
    },
    "sc": {
      "btc": "0.00000001246772058360410094750372",
      "usd": "0.000867470505459251936",
      "usdt": "0.000869"
    },
    "twt": {
      "btc": "0.00000631850879749050179203755983",
      "usd": "0.4396248683593262976",
      "usdt": "0.4404"
    },
    "arb": {
      "btc": "0.00000146054540323463461042103449",
      "usd": "0.1016208256107616192",
      "usdt": "0.1018"
    },
    "btc": {
      "btc": "1",
      "usd": "69577.31364304350442656",
      "usdt": "69699.99"
    },
    "cvc": {
      "btc": "0.00000038780493368793883614617448",
      "usd": "0.02698242550352540832",
      "usdt": "0.02703"
    },
    "ardr": {
      "btc": "0.00000050545200939053219376358591",
      "usd": "0.03516799298887162912",
      "usdt": "0.03523"
    },
    "vite": {
      "btc": "0.00000001233859574441832775011876",
      "usd": "0.00085848634602411584",
      "usdt": "0.00086"
    },
    "gmx": {
      "btc": "0.00008737447451570653023049214211",
      "usd": "6.07928121777542496",
      "usdt": "6.09"
    },
    "sei": {
      "btc": "0.00000097991405737647882015478051",
      "usd": "0.0681797877133105952",
      "usdt": "0.0683"
    },
    "matic": {
      "btc": "0.00000544332933189803900976169437",
      "usd": "0.3787322321878483136",
      "usdt": "0.3794"
    },
    "audio": {
      "btc": "0.00000026370161602605681865951487",
      "usd": "0.01834765004642238272",
      "usdt": "0.01838"
    },
    "ark": {
      "btc": "0.00000207460574958475603798508436",
      "usd": "0.1443454949245199424",
      "usdt": "0.1446"
    },
    "cvp": {
      "btc": "0.00000048637022759974571015003015",
      "usd": "0.0338403338723459616",
      "usdt": "0.0339"
    },
    "key": {
      "btc": "0.00000001797704705553042403592884",
      "usd": "0.001250794641358392032",
      "usdt": "0.001253"
    },
    "btt": {
      "btc": "0",
      "usd": "0",
      "usdt": "0"
    },
    "cvx": {
      "btc": "0.00002160688975708604836241726864",
      "usd": "1.503349345479440064",
      "usdt": "1.506"
    },
    "flm": {
      "btc": "0.00000023959831271137915514765497",
      "usd": "0.0166706069518636448",
      "usdt": "0.0167"
    },
    "one": {
      "btc": "0.00000002539455170653539548570954",
      "usd": "0.00176688468891009888",
      "usdt": "0.00177"
    },
    "btx": {
      "btc": "0.00000258106206328006646772833109",
      "usd": "0.1795833647089981856",
      "usdt": "0.1799"
    },
    "ong": {
      "btc": "0.00000087460557741830379028748785",
      "usd": "0.06085270657398849024",
      "usdt": "0.06096"
    },
    "gno": {
      "btc": "0.00161434743390924446330623576847",
      "usd": "112.32195773794594688",
      "usdt": "112.52"
    },
    "storj": {
      "btc": "0.00000140602602668953037152516091",
      "usd": "0.097827513849259712",
      "usdt": "0.098"
    },
    "gns": {
      "btc": "0.00000662840841153635746576147285",
      "usd": "0.461186851003652928",
      "usdt": "0.462"
    },
    "people": {
      "btc": "0.00000008823530677694501821305857",
      "usd": "0.0061391756140096656",
      "usdt": "0.00615"
    },
    "tnsr": {
      "btc": "0.00000050358687282451546980135865",
      "usd": "0.0350382217970307744",
      "usdt": "0.0351"
    },
    "bttc": {
      "btc": "0.00000000000444763334973218790993",
      "usd": "0.00000030945438054357664",
      "usdt": "0.00000031"
    },
    "vtho": {
      "btc": "0.00000000675753325072213066314644",
      "usd": "0.000470171010438789024",
      "usdt": "0.000471"
    },
    "polyx": {
      "btc": "0.00000069296997029698282596597216",
      "usd": "0.0482149889685637152",
      "usdt": "0.0483"
    },
    "t": {
      "btc": "0.00000006771880455076105462855877",
      "usd": "0.00471169250376026368",
      "usdt": "0.00472"
    },
    "ont": {
      "btc": "0.00000074160699305695739698097518",
      "usd": "0.05159902235579831136",
      "usdt": "0.05169"
    },
    "mana": {
      "btc": "0.00000118794852050911341594166656",
      "usd": "0.0826542668032520832",
      "usdt": "0.0828"
    },
    "cfx": {
      "btc": "0.00000073615505540244697309138782",
      "usd": "0.05121969117964812064",
      "usdt": "0.05131"
    },
    "w": {
      "btc": "0.00000015925396832912027677478863",
      "usd": "0.0110804633033345184",
      "usdt": "0.0111"
    },
    "dodo": {
      "btc": "0.00000025652801384906941880479466",
      "usd": "0.01784853007780371072",
      "usdt": "0.01788"
    },
    "ankr": {
      "btc": "0.00000006327117120102886671863224",
      "usd": "0.00440223812321668704",
      "usdt": "0.00441"
    },
    "mina": {
      "btc": "0.00000077761847598543414425167062",
      "usd": "0.0541046045982640448",
      "usdt": "0.0542"
    },
    "sfp": {
      "btc": "0.00000377761890640156476349566191",
      "usd": "0.2628365754745926752",
      "usdt": "0.2633"
    },
    "dia": {
      "btc": "0.00000229411797620057047353952275",
      "usd": "0.1596185659642513056",
      "usdt": "0.1599"
    },
    "aca": {
      "btc": "0.00000002582496783715463947699275",
      "usd": "0.0017968318870272192",
      "usdt": "0.0018"
    },
    "algo": {
      "btc": "0.00000150789117760275144946218787",
      "usd": "0.1049150174036448544",
      "usdt": "0.1051"
    },
    "asr": {
      "btc": "0.0000142467739234969761114743345",
      "usd": "0.991252257676682592",
      "usdt": "0.993"
    },
    "df": {
      "btc": "0.00000002352941514051867152348228",
      "usd": "0.00163711349706924416",
      "usdt": "0.00164"
    },
    "ast": {
      "btc": "0.00000037446203363874227241639489",
      "usd": "0.0260540623618946784",
      "usdt": "0.0261"
    },
    "jup": {
      "btc": "0.00000246484970801287059008186371",
      "usd": "0.1714976212173756992",
      "usdt": "0.1718"
    },
    "dusk": {
      "btc": "0.00000175322837205572052449361901",
      "usd": "0.1219849203304034368",
      "usdt": "0.1222"
    },
    "doge": {
      "btc": "0.00000140975629982156381944961542",
      "usd": "0.09808705623294142144",
      "usdt": "0.09826"
    },
    "bel": {
      "btc": "0.0000013543760910152210925711754",
      "usd": "0.0942338500752052736",
      "usdt": "0.0944"
    },
    "acm": {
      "btc": "0.00000507891034130707909714190777",
      "usd": "0.353376937782019776",
      "usdt": "0.354"
    },
    "juv": {
      "btc": "0.00000562410410675812148610064363",
      "usd": "0.391310055397038848",
      "usdt": "0.392"
    },
    "bome": {
      "btc": "0.00000000704447733780162665733524",
      "usd": "0.000490135809183535904",
      "usdt": "0.000491"
    },
    "tia": {
      "btc": "0.00000594835092515795195953399706",
      "usd": "0.4138702779786028224",
      "usdt": "0.4146"
    },
    "ata": {
      "btc": "0.0000000172166452247697596513285",
      "usd": "0.0011978879246848128",
      "usdt": "0.0012"
    },
    "nmr": {
      "btc": "0.00011865138000737159359707225209",
      "usd": "8.25544428095283488",
      "usdt": "8.27"
    },
    "loom": {
      "btc": "0.00000069311344234052257396306657",
      "usd": "0.04822497136793608864",
      "usdt": "0.04831"
    },
    "paxg": {
      "btc": "0.06401148694569396638363936637581",
      "usd": "4453.7473039781339904",
      "usdt": "4461.6"
    },
    "lit": {
      "btc": "0.00001065997283500327618411423015",
      "usd": "0.741692273367346592",
      "usdt": "0.743"
    },
    "woo": {
      "btc": "0.00000304160732304265753840136849",
      "usd": "0.211626866694316928",
      "usdt": "0.212"
    },
    "rei": {
      "btc": "0.00000005753228945943894683485607",
      "usd": "0.00400294214832174944",
      "usdt": "0.00401"
    },
    "rare": {
      "btc": "0.00000020803446313263459578688605",
      "usd": "0.014474479089941488",
      "usdt": "0.0145"
    },
    "zec": {
      "btc": "0.00754318616114579069523539386448",
      "usd": "524.83462940190598144",
      "usdt": "525.76"
    },
    "ren": {
      "btc": "0.00000061319951408888293958148344",
      "usd": "0.04266477491752408256",
      "usdt": "0.04274"
    },
    "atm": {
      "btc": "0.00001398852424512542971670440699",
      "usd": "0.9732839388064104",
      "usdt": "0.975"
    },
    "hbar": {
      "btc": "0.00000128335742946304583400944534",
      "usd": "0.0892925623858804208",
      "usdt": "0.08945"
    },
    "rep": {
      "btc": "0.00006786227659430080262565317441",
      "usd": "4.72167490313263712",
      "usdt": "4.73"
    },
    "elf": {
      "btc": "0.00000325968482922307449398486284",
      "usd": "0.2268001137403245568",
      "usdt": "0.2272"
    },
    "pepe": {
      "btc": "0.00000000004777619049873608303244",
      "usd": "0.00000332413899100035552",
      "usdt": "0.00000333"
    },
    "icx": {
      "btc": "0.00000050789103413070790971419078",
      "usd": "0.0353376937782019776",
      "usdt": "0.0354"
    },
    "req": {
      "btc": "0.00000099856542303664605977705305",
      "usd": "0.0694774996317191424",
      "usdt": "0.0696"
    },
    "xai": {
      "btc": "0.00000013328552844842588930070148",
      "usd": "0.00927364901693492576",
      "usdt": "0.00929"
    },
    "strax": {
      "btc": "0.00000016427548985301145667309278",
      "usd": "0.0114298472813675888",
      "usdt": "0.01145"
    },
    "chess": {
      "btc": "0.00000004031564423466918718352757",
      "usd": "0.00280505422363693664",
      "usdt": "0.00281"
    },
    "tusd": {
      "btc": "0.00001434433491310400474949852934",
      "usd": "0.9980402892498965312",
      "usdt": "0.9998"
    },
    "ctsi": {
      "btc": "0.00000038694410142670034816360806",
      "usd": "0.02692253110729116768",
      "usdt": "0.02697"
    },
    "sxp": {
      "btc": "0.00000003156384957874455936076892",
      "usd": "0.0021961278619221568",
      "usdt": "0.0022"
    },
    "rvn": {
      "btc": "0.00000007259685403111248652976851",
      "usd": "0.00505109408242096064",
      "usdt": "0.00506"
    },
    "chr": {
      "btc": "0.00000027202299455136220249099031",
      "usd": "0.01892662921002004224",
      "usdt": "0.01896"
    },
    "fida": {
      "btc": "0.0000003985653369534199359282548",
      "usd": "0.02773110545645341632",
      "usdt": "0.02778"
    },
    "ntrn": {
      "btc": "0.00000002295552696635967953510467",
      "usd": "0.0015971838995797504",
      "usdt": "0.0016"
    },
    "sand": {
      "btc": "0.00000095667158632303964462548703",
      "usd": "0.06656263901498609792",
      "usdt": "0.06668"
    },
    "osmo": {
      "btc": "0.00000079913928251639634381583125",
      "usd": "0.0556019645041200608",
      "usdt": "0.0557"
    },
    "kava": {
      "btc": "0.00000077073181789552624039113922",
      "usd": "0.05362544942839011968",
      "usdt": "0.05372"
    },
    "ocean": {
      "btc": "0.00000878479322593876986209036759",
      "usd": "0.6112223135704257312",
      "usdt": "0.6123"
    },
    "vidt": {
      "btc": "0.00000001649928500707101966585648",
      "usd": "0.0011479759278229456",
      "usdt": "0.00115"
    },
    "adx": {
      "btc": "0.00000082209480948275602335093592",
      "usd": "0.0571991484036998112",
      "usdt": "0.0573"
    },
    "chz": {
      "btc": "0.00000048938314051408041808901264",
      "usd": "0.03404996425916580384",
      "usdt": "0.03411"
    },
    "xrp": {
      "btc": "0.00003067001874749192933887078031",
      "usd": "2.1339375138322702688",
      "usdt": "2.1377"
    },
    "c98": {
      "btc": "0.00000027259688272552119447936793",
      "usd": "0.018966558807509536",
      "usdt": "0.019"
    },
    "psg": {
      "btc": "0.00001609756328515972527399214835",
      "usd": "1.120025209580299968",
      "usdt": "1.122"
    },
    "perp": {
      "btc": "0.00000179340054424684996368005218",
      "usd": "0.124779992154668",
      "usdt": "0.125"
    },
    "for": {
      "btc": "0.00000004390244532316288711088768",
      "usd": "0.00305461420794627264",
      "usdt": "0.00306"
    },
    "uma": {
      "btc": "0.00000602582582866941587796497532",
      "usd": "0.41926077363968448",
      "usdt": "0.42"
    },
    "syn": {
      "btc": "0.00000057675761502978694831950478",
      "usd": "0.0401292454769412288",
      "usdt": "0.0402"
    },
    "jasmy": {
      "btc": "0.00000007847920781624215441063908",
      "usd": "0.00546037245668827168",
      "usdt": "0.00547"
    },
    "sys": {
      "btc": "0.00000003199426570936380335205213",
      "usd": "0.00222607506003927712",
      "usdt": "0.00223"
    },
    "lunc": {
      "btc": "0.00000000117962714198380803211019",
      "usd": "0.00008207528763965442368",
      "usdt": "0.00008222"
    },
    "luna": {
      "btc": "0.0000008421808955783207429441525",
      "usd": "0.0585966843158320928",
      "usdt": "0.0587"
    },
    "auction": {
      "btc": "0.00006327117120102886671863224084",
      "usd": "4.40223812321668704",
      "usdt": "4.41"
    },
    "not": {
      "btc": "0.00000000616929787220916387505938",
      "usd": "0.00042924317301205792",
      "usdt": "0.00043"
    },
    "gal": {
      "btc": "0.00003647059346780394086139754109",
      "usd": "2.537525920457328448",
      "usdt": "2.542"
    },
    "yfii": {
      "btc": "0.00624820749615602527346130178785",
      "usd": "434.733492666863312",
      "usdt": "435.5"
    },
    "alpha": {
      "btc": "0.00000013916788223355555718157205",
      "usd": "0.0096829273912022368",
      "usdt": "0.0097"
    },
    "tko": {
      "btc": "0.00000072740326074652234526862916",
      "usd": "0.0506107648179333408",
      "usdt": "0.0507"
    },
    "pixel": {
      "btc": "0.00000009153516377835922214622986",
      "usd": "0.00636877079957425472",
      "usdt": "0.00638"
    },
    "nexo": {
      "btc": "0.00001172166595719741136261282103",
      "usd": "0.815562028722910048",
      "usdt": "0.817"
    },
    "bico": {
      "btc": "0.00000032711625927062543337524152",
      "usd": "0.0227598705690114432",
      "usdt": "0.0228"
    },
    "troy": {
      "btc": "0.00000000098995710042426117995139",
      "usd": "0.000068878555669376736",
      "usdt": "0.000069"
    },
    "mask": {
      "btc": "0.00000612625625914723947593105824",
      "usd": "0.426248453200345888",
      "usdt": "0.427"
    },
    "enj": {
      "btc": "0.00000055078917514909256084541762",
      "usd": "0.03832243119054163616",
      "usdt": "0.03839"
    },
    "aave": {
      "btc": "0.00114361565905533128483949567281",
      "usd": "79.56970539718869024",
      "usdt": "79.71"
    },
    "wan": {
      "btc": "0.00000077905319642083162422261467",
      "usd": "0.0542044285919877792",
      "usdt": "0.0543"
    },
    "gm": {
      "btc": "0.01025179487113269313238065026746",
      "usd": "713.2923471529441552",
      "usdt": "714.55"
    },
    "oax": {
      "btc": "0.00000051362991587229782959796694",
      "usd": "0.0357369897530969152",
      "usdt": "0.0358"
    },
    "btxtest2": {
      "btc": "0.00000529124896574590613284162594",
      "usd": "0.3681508888531324672",
      "usdt": "0.3688"
    },
    "orn": {
      "btc": "0.00001510760618473546409404075955",
      "usd": "1.051146653910923232",
      "usdt": "1.053"
    },
    "ens": {
      "btc": "0.00008163559277411661034671597514",
      "usd": "5.67998524288048736",
      "usdt": "5.69"
    },
    "pda": {
      "btc": "0.00000014017218653833379316123288",
      "usd": "0.00975280418680885088",
      "usdt": "0.00977"
    },
    "bond": {
      "btc": "0.00003087518376975376897471577829",
      "usd": "2.148212344934764288",
      "usdt": "2.152"
    },
    "tlm": {
      "btc": "0.00000001956958673882162680367673",
      "usd": "0.001361599274391737216",
      "usdt": "0.001364"
    },
    "kp3r": {
      "btc": "0.00023644192775350469921157807914",
      "usd": "16.45099416567142912",
      "usdt": "16.48"
    },
    "lqty": {
      "btc": "0.00000337159302318407793171849809",
      "usd": "0.23458638525077584",
      "usdt": "0.235"
    },
    "ckb": {
      "btc": "0.0000000177474917858668272405778",
      "usd": "0.001234822802362594528",
      "usdt": "0.001237"
    },
    "bigtime": {
      "btc": "0.00000015738883176310355281256138",
      "usd": "0.01095069211149366368",
      "usdt": "0.01097"
    },
    "yfi": {
      "btc": "0.03238164022692112294420702212439",
      "usd": "2253.027538344685408",
      "usdt": "2257"
    },
    "xtz": {
      "btc": "0.00000443328614537821311021708898",
      "usd": "0.308456140606339296",
      "usdt": "0.309"
    },
    "dexe": {
      "btc": "0.00024246775358217411508954305445",
      "usd": "16.8702549393111136",
      "usdt": "16.9"
    },
    "meme": {
      "btc": "0.00000000675753325072213066314644",
      "usd": "0.000470171010438789024",
      "usdt": "0.000471"
    },
    "dego": {
      "btc": "0.00000040172172191129439186433169",
      "usd": "0.027950718242645632",
      "usdt": "0.028"
    },
    "eos": {
      "btc": "0.00001118938467566494629339258155",
      "usd": "0.7785273270514045856",
      "usdt": "0.7799"
    },
    "alice": {
      "btc": "0.0000016944048342044238456849133",
      "usd": "0.1178921365877303264",
      "usdt": "0.1181"
    },
    "ooki": {
      "btc": "0.00000000170731731812300116542341",
      "usd": "0.000118790552531243936",
      "usdt": "0.000119"
    },
    "rif": {
      "btc": "0.00000098278349824727378009666859",
      "usd": "0.068379435700758064",
      "usdt": "0.0685"
    },
    "rune": {
      "btc": "0.00000595408980689954187941777323",
      "usd": "0.41426957395349776",
      "usdt": "0.415"
    },
    "hook": {
      "btc": "0.00000011190819396100343773363526",
      "usd": "0.0077862715104512832",
      "usdt": "0.0078"
    },
    "skl": {
      "btc": "0.00000007991392825163963438158313",
      "usd": "0.00556019645041200608",
      "usdt": "0.00557"
    },
    "alpaca": {
      "btc": "0.00000321951265703194505479842967",
      "usd": "0.2240050419160599936",
      "usdt": "0.2244"
    },
    "tom2": {
      "btc": "0.01002482209825281180097730286387",
      "usd": "697.50019134584937312",
      "usdt": "698.73"
    },
    "gtc": {
      "btc": "0.00000133429000491965637297795882",
      "usd": "0.092836314163072992",
      "usdt": "0.093"
    },
    "tom3": {
      "btc": "0.01002381779394803356499764203465",
      "usd": "697.43031455024275904",
      "usdt": "698.66"
    },
    "xec": {
      "btc": "0.00000000009612626917163115805325",
      "usd": "0.0000066882075794902048",
      "usdt": "0.0000067"
    },
    "ygg": {
      "btc": "0.00000048837883620930218210935181",
      "usd": "0.03398008746355918976",
      "usdt": "0.03404"
    },
    "1inch": {
      "btc": "0.00000121377348834626805541865931",
      "usd": "0.0844510986902793024",
      "usdt": "0.0846"
    },
    "id": {
      "btc": "0.00000037446203363874227241639489",
      "usd": "0.0260540623618946784",
      "usdt": "0.0261"
    },
    "portal": {
      "btc": "0.00000010860833695958923380046396",
      "usd": "0.00755667632488669408",
      "usdt": "0.00757"
    },
    "zil": {
      "btc": "0.00000005322812815324650692202395",
      "usd": "0.00370347016715054624",
      "usdt": "0.00371"
    },
    "axs": {
      "btc": "0.00001576757758501830488067501875",
      "usd": "1.097065691023841056",
      "usdt": "1.099"
    },
    "btxtest": {
      "btc": "0.00000134863720927363117268739923",
      "usd": "0.093834554100310336",
      "usdt": "0.094"
    },
    "comp": {
      "btc": "0.00025423246115243345085128419674",
      "usd": "17.68881168784573568",
      "usdt": "17.72"
    },
    "io": {
      "btc": "0.0000022754666105404032339172502",
      "usd": "0.1583208540458427584",
      "usdt": "0.1586"
    },
    "xvg": {
      "btc": "0.00000004427547263636623190333313",
      "usd": "0.003080568446314443584",
      "usdt": "0.003086"
    },
    "iq": {
      "btc": "0.00000001460545403234634610421034",
      "usd": "0.001016208256107616192",
      "usdt": "0.001018"
    },
    "pundix": {
      "btc": "0.00000189813513603086600155896723",
      "usd": "0.1320671436965006112",
      "usdt": "0.1323"
    },
    "unfi": {
      "btc": "0.00001923960103868020641035959976",
      "usd": "1.338639755835278304",
      "usdt": "1.341"
    },
    "cream": {
      "btc": "0.00003012912914334707938982487659",
      "usd": "2.0963038681984224",
      "usdt": "2.1"
    },
    "forth": {
      "btc": "0.00000340028743189202753113737893",
      "usd": "0.236582865125250528",
      "usdt": "0.237"
    },
    "clv": {
      "btc": "0.00000042137739187623986746626506",
      "usd": "0.02931830695666079328",
      "usdt": "0.02937"
    },
    "powr": {
      "btc": "0.00000084505033644911570288604059",
      "usd": "0.0587963323032795616",
      "usdt": "0.0589"
    },
    "zk": {
      "btc": "0.0000001889526813418481121733303",
      "usd": "0.01314681997341582048",
      "usdt": "0.01317"
    },
    "ctxc": {
      "btc": "0.00000090961275604200230157852246",
      "usd": "0.0632884120208476096",
      "usdt": "0.0634"
    },
    "ghst": {
      "btc": "0.00000154949807022927836861956508",
      "usd": "0.107809913221633152",
      "usdt": "0.108"
    },
    "xvs": {
      "btc": "0.00003758967540741397523873389365",
      "usd": "2.61538863556184128",
      "usdt": "2.62"
    },
    "slp": {
      "btc": "0.00000000865136422544680422479257",
      "usd": "0.000601938682154118432",
      "usdt": "0.000603"
    },
    "hft": {
      "btc": "0.00000015064564571673539694912438",
      "usd": "0.010481519340992112",
      "usdt": "0.0105"
    },
    "beamx": {
      "btc": "0.00000002377331761453624311854277",
      "usd": "0.001654083576002279008",
      "usdt": "0.001657"
    },
    "idex": {
      "btc": "0.00000002855093666440985142178643",
      "usd": "0.00198649747510231456",
      "usdt": "0.00199"
    },
    "hive": {
      "btc": "0.00000081779064817656358343810379",
      "usd": "0.056899676422528608",
      "usdt": "0.057"
    },
    "kmd": {
      "btc": "0.0000002338594309697892352638788",
      "usd": "0.0162713109769687072",
      "usdt": "0.0163"
    },
    "city": {
      "btc": "0.00000611190905479326467622161782",
      "usd": "0.425250213263108544",
      "usdt": "0.426"
    },
    "steem": {
      "btc": "0.00000072482076396280688132092989",
      "usd": "0.05043108162923061888",
      "usdt": "0.05052"
    },
    "celr": {
      "btc": "0.0000000330846532402658881299696",
      "usd": "0.002301941295269315264",
      "usdt": "0.002306"
    },
    "dot": {
      "btc": "0.00010489241103190976067571889175",
      "usd": "7.298132181142221984",
      "usdt": "7.311"
    },
    "celo": {
      "btc": "0.00000103314218552972532707680446",
      "usd": "0.07188325788046114144",
      "usdt": "0.07201"
    },
    "rdnt": {
      "btc": "0.00000004705883028103734304696457",
      "usd": "0.00327422699413848832",
      "usdt": "0.00328"
    },
    "ton": {
      "btc": "0.00002502152439333205069326408799",
      "usd": "1.740930450541927936",
      "usdt": "1.744"
    },
    "pros": {
      "btc": "0.00000053371600196786254919118353",
      "usd": "0.0371345256652291968",
      "usdt": "0.0372"
    },
    "prom": {
      "btc": "0.00001497848134554969089665579579",
      "usd": "1.042162494475787136",
      "usdt": "1.044"
    },
    "ftm": {
      "btc": "0.00001003443472516997491678262795",
      "usd": "0.6981690121037983936",
      "usdt": "0.6994"
    },
    "knc": {
      "btc": "0.00000194835035126977780054200869",
      "usd": "0.1355609834768313152",
      "usdt": "0.1358"
    },
    "mav": {
      "btc": "0.00000017604019742327079243483392",
      "usd": "0.01224840402990221088",
      "usdt": "0.01227"
    },
    "bifi": {
      "btc": "0.00046054525976259107067303739929",
      "usd": "32.0435019853187424",
      "usdt": "32.1"
    },
    "ftt": {
      "btc": "0.00000420086143484382135492415422",
      "usd": "0.2922846536230943232",
      "usdt": "0.2928"
    },
    "rlc": {
      "btc": "0.00000614060346350121427564049866",
      "usd": "0.427246693137583232",
      "usdt": "0.428"
    },
    "pha": {
      "btc": "0.00000057962705590058190826139286",
      "usd": "0.0403288934643886976",
      "usdt": "0.0404"
    },
    "manta": {
      "btc": "0.00000115896716771408432052859692",
      "usd": "0.08063782213003264832",
      "usdt": "0.08078"
    },
    "phb": {
      "btc": "0.00000021520806530962199564160626",
      "usd": "0.01497359905856016",
      "usdt": "0.015"
    },
    "xaut": {
      "btc": "0.06391320859586923900562969951646",
      "usd": "4446.909360408058184",
      "usdt": "4454.75"
    },
    "blz": {
      "btc": "0.00000083500729340133334308943229",
      "usd": "0.0580975643472134208",
      "usdt": "0.0582"
    },
    "lpt": {
      "btc": "0.00002971306021708181019825110448",
      "usd": "2.067354910018539424",
      "usdt": "2.071"
    },
    "gft": {
      "btc": "0.00000002812052053379060743050322",
      "usd": "0.00195655027698519424",
      "usdt": "0.00196"
    },
    "api3": {
      "btc": "0.00000432568211272340211239628585",
      "usd": "0.300969341077059216",
      "usdt": "0.3015"
    },
    "voxel": {
      "btc": "0.00000020086086095564719593216584",
      "usd": "0.013975359121322816",
      "usdt": "0.014"
    },
    "waxp": {
      "btc": "0.00000008378767342721283030313204",
      "usd": "0.00582972123346608896",
      "usdt": "0.00584"
    },
    "mbl": {
      "btc": "0.00000001202295724863088215651107",
      "usd": "0.000836525067404894272",
      "usdt": "0.000838"
    },
    "snt": {
      "btc": "0.00000039024395842811455209677935",
      "usd": "0.0271521262928557568",
      "usdt": "0.0272"
    },
    "glmr": {
      "btc": "0.00000017073173181230011654234097",
      "usd": "0.0118790552531243936",
      "usdt": "0.0119"
    },
    "rose": {
      "btc": "0.00000012969872735993218937334137",
      "usd": "0.00902408903262558976",
      "usdt": "0.00904"
    },
    "snx": {
      "btc": "0.00000426111969313051551370380397",
      "usd": "0.296477261359491168",
      "usdt": "0.297"
    },
    "atom": {
      "btc": "0.00002912482483856884341016404737",
      "usd": "2.02642707259180832",
      "usdt": "2.03"
    },
    "fun": {
      "btc": "0.00000000490674388905938150062862",
      "usd": "0.000341398058535171648",
      "usdt": "0.000342"
    },
    "arkm": {
      "btc": "0.00000189526569516007104161707914",
      "usd": "0.1318674957090531424",
      "usdt": "0.1321"
    },
    "magic": {
      "btc": "0.00000080631288469338374367055146",
      "usd": "0.0561010844727387328",
      "usdt": "0.0562"
    },
    "quick": {
      "btc": "0.0000001133429143964009177045793",
      "usd": "0.0078860955041750176",
      "usdt": "0.0079"
    },
    "data": {
      "btc": "0.00000001262553983149782374430757",
      "usd": "0.00087845114476886272",
      "usdt": "0.00088"
    },
    "cos": {
      "btc": "0.00000001698708995510616285597745",
      "usd": "0.001181916085689015296",
      "usdt": "0.001184"
    },
    "usd": {
      "btc": "0.00001437250085754",
      "usd": "1",
      "usdt": "1.001763166045557164"
    },
    "qkc": {
      "btc": "0.00000003886657659491773241287409",
      "usd": "0.002704231989975964896",
      "usdt": "0.002709"
    },
    "pyr": {
      "btc": "0.00000331420420576817873288073642",
      "usd": "0.230593425501826464",
      "usdt": "0.231"
    },
    "dai": {
      "btc": "0",
      "usd": "0",
      "usdt": "0"
    },
    "sol": {
      "btc": "0.00123256832604997504303802626055",
      "usd": "85.75879300806022304",
      "usdt": "85.91"
    },
    "high": {
      "btc": "0.00000182209495295479956309893301",
      "usd": "0.126776472029142688",
      "usdt": "0.127"
    },
    "burger": {
      "btc": "0.00000024677191488836655500237518",
      "usd": "0.0171697269204823168",
      "usdt": "0.0172"
    },
    "lazio": {
      "btc": "0.00000710186615521752585617300662",
      "usd": "0.49412876893248528",
      "usdt": "0.495"
    },
    "dar": {
      "btc": "0.00000311434764911730977292823141",
      "usd": "0.21668794317611026208",
      "usdt": "0.21707"
    },
    "etc": {
      "btc": "0.00011707318752843436562903380617",
      "usd": "8.14563788785672704",
      "usdt": "8.16"
    },
    "ogn": {
      "btc": "0.00000029397421721294364604643415",
      "usd": "0.02045393631399317856",
      "usdt": "0.02049"
    },
    "bnb": {
      "btc": "0",
      "usd": "0",
      "usdt": "0"
    },
    "usdt": {
      "btc": "0.00001434720435397479970944041742",
      "usd": "0.998239937237344",
      "usdt": "1"
    },
    "eth": {
      "btc": "0.02855050624827923217779514745985",
      "usd": "1986.46752790419743968",
      "usdt": "1989.97"
    },
    "neo": {
      "btc": "0.00003835007723817463962333423577",
      "usd": "2.668295352235420512",
      "usdt": "2.673"
    },
    "lrc": {
      "btc": "0.00000026958396981118648654038544",
      "usd": "0.01875692842068969376",
      "usdt": "0.01879"
    },
    "ordi": {
      "btc": "0.00038436160464298488421590878268",
      "usd": "26.74284791858844576",
      "usdt": "26.79"
    },
    "saga": {
      "btc": "0.00000025552370954429118282513383",
      "usd": "0.01777865328219709664",
      "usdt": "0.01781"
    },
    "usdn": {
      "btc": "0.00001434720435397479970944041742",
      "usd": "0.998239937237344",
      "usdt": "1"
    },
    "pengu": {
      "btc": "0.00000011054520954737583176123842",
      "usd": "0.00769143871641373552",
      "usdt": "0.007705"
    },
    "lista": {
      "btc": "0.00000090243915386501490172380226",
      "usd": "0.0627892920522289376",
      "usdt": "0.0629"
    },
    "spell": {
      "btc": "0.0000000020946918356803207575783",
      "usd": "0.000145743030836652224",
      "usdt": "0.000146"
    },
    "tao": {
      "btc": "0.00369870928245470336509373961173",
      "usd": "257.3462558197872832",
      "usdt": "257.8"
    },
    "mtl": {
      "btc": "0.00000393113399298909512038667437",
      "usd": "0.273517742803032256",
      "usdt": "0.274"
    },
    "trb": {
      "btc": "0.0002344333191439482272522564207",
      "usd": "16.31124057445820096",
      "usdt": "16.34"
    },
    "alt": {
      "btc": "0.00000009870876595534662200095007",
      "usd": "0.00686789076819292672",
      "usdt": "0.00688"
    },
    "bnt": {
      "btc": "0.00000460258315675511574678848591",
      "usd": "0.3202353718657399552",
      "usdt": "0.3208"
    },
    "oxt": {
      "btc": "0.00000013486372092736311726873992",
      "usd": "0.0093834554100310336",
      "usdt": "0.0094"
    },
    "lever": {
      "btc": "0.00000000251076076194558994915207",
      "usd": "0.0001746919890165352",
      "usdt": "0.000175"
    },
    "usdc": {
      "btc": "0.00001436542530350434770507140675",
      "usd": "0.99950770195763542688",
      "usdt": "1.00127"
    },
    "utk": {
      "btc": "0.00000011406027461409965769005132",
      "usd": "0.0079360075010368848",
      "usdt": "0.00795"
    },
    "bnx": {
      "btc": "0.00002556528343834769560225187981",
      "usd": "1.7787637441632232736",
      "usdt": "1.7819"
    },
    "aergo": {
      "btc": "0.00000091104747647739978154946651",
      "usd": "0.063388236014571344",
      "usdt": "0.0635"
    },
    "ilv": {
      "btc": "0.0000562410410675812148610064363",
      "usd": "3.91310055397038848",
      "usdt": "3.92"
    },
    "hifi": {
      "btc": "0.00000182209495295479956309893301",
      "usd": "0.126776472029142688",
      "usdt": "0.127"
    },
    "egld": {
      "btc": "0.0000506456313695310429743246735",
      "usd": "3.52378697844782432",
      "usdt": "3.53"
    },
    "tru": {
      "btc": "0.00000003299857001414203933171296",
      "usd": "0.0022959518556458912",
      "usdt": "0.0023"
    },
    "alpine": {
      "btc": "0.00000605452023737736547738385615",
      "usd": "0.421257253514159168",
      "usdt": "0.422"
    },
    "amb": {
      "btc": "0.00000000459110539327193590702093",
      "usd": "0.00031943677991595008",
      "usdt": "0.00032"
    },
    "edu": {
      "btc": "0.00000061979922809171134744782603",
      "usd": "0.0431239652886532608",
      "usdt": "0.0432"
    },
    "nfp": {
      "btc": "0.00000013228122414364765332104065",
      "usd": "0.00920377222132831168",
      "usdt": "0.00922"
    },
    "ustc": {
      "btc": "0.00000008637017021092829425083131",
      "usd": "0.00600940442216881088",
      "usdt": "0.00602"
    },
    "trx": {
      "btc": "0.00000501578264214958997842036993",
      "usd": "0.3489846820581754624",
      "usdt": "0.3496"
    },
    "dash": {
      "btc": "0.00055824972141315945669432664194",
      "usd": "38.84151595790505504",
      "usdt": "38.91"
    },
    "nuls": {
      "btc": "0.00000037015787233254983250356277",
      "usd": "0.0257545903807234752",
      "usdt": "0.0258"
    },
    "mdx": {
      "btc": "0.0000004949785502121305899756944",
      "usd": "0.034439277834688368",
      "usdt": "0.0345"
    },
    "joe": {
      "btc": "0.00000054088960414484994904590374",
      "usd": "0.0376336456338478688",
      "usdt": "0.0377"
    },
    "pond": {
      "btc": "0.00000002482066353237640349733192",
      "usd": "0.00172695509142060512",
      "usdt": "0.00173"
    },
    "lina": {
      "btc": "0.00000000483500786728950750208142",
      "usd": "0.000336406858848984928",
      "usdt": "0.000337"
    },
    "lsk": {
      "btc": "0.00000154949807022927836861956508",
      "usd": "0.107809913221633152",
      "usdt": "0.108"
    },
    "amp": {
      "btc": "0.00000001045911197404762898818206",
      "usd": "0.000727716914246023776",
      "usdt": "0.000729"
    },
    "pendle": {
      "btc": "0.00002130559846565257756851901987",
      "usd": "1.48238630679745584",
      "usdt": "1.485"
    },
    "dydx": {
      "btc": "0.00000210946945616491480127902457",
      "usd": "0.14677121797200668832",
      "usdt": "0.14703"
    },
    "busd": {
      "btc": "0.00001435150851528099214935324955",
      "usd": "0.9985394092185152032",
      "usdt": "1.0003"
    },
    "akro": {
      "btc": "0.00000001407460747124927851496105",
      "usd": "0.000979273378429834464",
      "usdt": "0.000981"
    },
    "alcx": {
      "btc": "0.00005710187332881970284357286134",
      "usd": "3.97299495020462912",
      "usdt": "3.98"
    },
    "qtum": {
      "btc": "0.00001219512370087857975302435481",
      "usd": "0.8485039466517424",
      "usdt": "0.85"
    },
    "arpa": {
      "btc": "0.00000014117649084311202914089371",
      "usd": "0.00982268098241546496",
      "usdt": "0.00984"
    },
    "coti": {
      "btc": "0.0000001616929930692959927253935",
      "usd": "0.01125016409266486688",
      "usdt": "0.01127"
    },
    "dcr": {
      "btc": "0.000233859430969789235263878804",
      "usd": "16.2713109769687072",
      "usdt": "16.3"
    },
    "og": {
      "btc": "0.00003967002003874032119660275418",
      "usd": "2.76013342646125616",
      "usdt": "2.765"
    },
    "ethfi": {
      "btc": "0.00000523672958920080189394575236",
      "usd": "0.36435757709163056",
      "usdt": "0.365"
    },
    "flux": {
      "btc": "0.00000094835020779773426079401159",
      "usd": "0.0659836598513884384",
      "usdt": "0.0661"
    },
    "ltc": {
      "btc": "0.00185667171544787883039868441832",
      "usd": "129.18223027788468704",
      "usdt": "129.41"
    },
    "win": {
      "btc": "0.0000000002743185472479981704445",
      "usd": "0.00001908634759997801728",
      "usdt": "0.00001912"
    },
    "beta": {
      "btc": "0.00000000516499356743092789539855",
      "usd": "0.00035936637740544384",
      "usdt": "0.00036"
    },
    "om": {
      "btc": "0.00000095982797128091410056156393",
      "usd": "0.0667822518011783136",
      "usdt": "0.0669"
    },
    "fxs": {
      "btc": "0.00001164992993542753736406561895",
      "usd": "0.810570829036723328",
      "usdt": "0.812"
    },
    "pla": {
      "btc": "0.00000336728886187788549180566597",
      "usd": "0.2342869132696046368",
      "usdt": "0.2347"
    },
    "ant": {
      "btc": "0.00010626974264989134144782517185",
      "usd": "7.393963215117007008",
      "usdt": "7.407"
    },
    "vgx": {
      "btc": "0.00000025824967837154639476992751",
      "usd": "0.017968318870272192",
      "usdt": "0.018"
    },
    "lto": {
      "btc": "0.00000005451937654510423889587359",
      "usd": "0.0037933117615019072",
      "usdt": "0.0038"
    },
    "crv": {
      "btc": "0.0000030143476347701054189534317",
      "usd": "0.2097302108135659744",
      "usdt": "0.2101"
    },
    "aeur": {
      "btc": "0.00001650358916837721210576931216",
      "usd": "1.1482753998041168032",
      "usdt": "1.1503"
    },
    "movr": {
      "btc": "0.00002493544116720820189500744548",
      "usd": "1.734941010918503872",
      "usdt": "1.738"
    },
    "srm": {
      "btc": "0.00000350674368819852054498142683",
      "usd": "0.24398980545955162048",
      "usdt": "0.24442"
    },
    "badger": {
      "btc": "0.00001093256971772879737859359808",
      "usd": "0.760658832174856128",
      "usdt": "0.762"
    },
    "rpl": {
      "btc": "0.00002295552696635967953510466788",
      "usd": "1.5971838995797504",
      "usdt": "1.6"
    },
    "super": {
      "btc": "0.00000156671471545404812827089358",
      "usd": "0.1090078011463179648",
      "usdt": "0.1092"
    },
    "aevo": {
      "btc": "0.0000003299857001414203933171296",
      "usd": "0.022959518556458912",
      "usdt": "0.023"
    },
    "pols": {
      "btc": "0.00000441750422058884083053670452",
      "usd": "0.3073580766753782176",
      "usdt": "0.3079"
    },
    "cyber": {
      "btc": "0.00000621233948527108827418770074",
      "usd": "0.432237892823769952",
      "usdt": "0.433"
    },
    "qnt": {
      "btc": "0.00100315652842991799568407398624",
      "usd": "69.79693641163509248",
      "usdt": "69.92"
    },
    "ldo": {
      "btc": "0.00000456958458674097370745677295",
      "usd": "0.317939420010094064",
      "usdt": "0.3185"
    },
    "bake": {
      "btc": "0.00000074461990597129210491995766",
      "usd": "0.0518086527426181536",
      "usdt": "0.0519"
    },
    "agix": {
      "btc": "0.00000881061819377592450156736034",
      "usd": "0.6130191454574529504",
      "usdt": "0.6141"
    },
    "xlm": {
      "btc": "0.00000288665751601972970153941199",
      "usd": "0.2008458753721536128",
      "usdt": "0.2012"
    },
    "stmx": {
      "btc": "0.00000006549498787589496067359551",
      "usd": "0.00455696531348847536",
      "usdt": "0.004565"
    },
    "front": {
      "btc": "0.00001262553983149782374430756733",
      "usd": "0.87845114476886272",
      "usdt": "0.88"
    },
    "gala": {
      "btc": "0.00000004304161306192439912832125",
      "usd": "0.002994719811712032",
      "usdt": "0.003"
    },
    "rndr": {
      "btc": "0.00010086084660844284195736613449",
      "usd": "7.01762675877852832",
      "usdt": "7.03"
    }
  },
  "ts": 1779979276010
}</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-28T22:41:16.125175" elapsed="0.000676"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:16.127140" level="INFO">${data} = {'uft': {'btc': '0.00000012769011875037571741401972', 'usd': '0.0088843354414123616', 'usdt': '0.0089'}, 'ksm': {'btc': '0.00006312769915748911872153783666', 'usd': '4.3922557238443136', 'usdt': '4.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-28T22:41:16.125952" elapsed="0.001214"/>
</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-28T22:41:16.127268" elapsed="0.000241"/>
</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-28T22:41:16.127626" elapsed="0.000143"/>
</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-28T22:41:16.128634" elapsed="0.000173"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T22:41:16.129136" 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-28T22:41:16.128903" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.129383" 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-28T22:41:16.129241" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:16.129799" 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-28T22:41:16.129636" elapsed="0.000229">Dictionary does not contain key 'rates'.</status>
</kw>
<msg time="2026-05-28T22:41:16.129940" 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-28T22:41:16.129524" 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-28T22:41:16.130293" 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-28T22:41:16.130163" elapsed="0.000176">Dictionary does not contain key 'base'.</status>
</kw>
<msg time="2026-05-28T22:41:16.130410" 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-28T22:41:16.130053" elapsed="0.000376"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:16.130755" 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-28T22:41:16.130628" elapsed="0.000170">Dictionary does not contain key 'timestamp'.</status>
</kw>
<msg time="2026-05-28T22:41:16.130868" 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-28T22:41:16.130521" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:16.131209" 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-28T22:41:16.131082" elapsed="0.000169">Dictionary does not contain key 'date'.</status>
</kw>
<msg time="2026-05-28T22:41:16.131318" 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-28T22:41:16.130975" elapsed="0.000386"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:16.131686" 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-28T22:41:16.131558" elapsed="0.000171">Dictionary does not contain key 'success'.</status>
</kw>
<msg time="2026-05-28T22:41:16.131799" 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-28T22:41:16.131453" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.132009" 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-28T22:41:16.131905" elapsed="0.000139"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.132221" 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-28T22:41:16.132126" elapsed="0.000127"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.132430" 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-28T22:41:16.132333" elapsed="0.000130"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.132622" 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-28T22:41:16.132538" elapsed="0.000114"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.132807" 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-28T22:41:16.132723" elapsed="0.000114"/>
</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-28T22:41:16.132913" elapsed="0.000079"/>
</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-28T22:41:16.133069" elapsed="0.000072"/>
</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-28T22:41:16.133221" elapsed="0.000164"/>
</kw>
<arg>${data}</arg>
<doc>验证价格转换字典的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:16.128248" elapsed="0.005186"/>
</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-28T22:41:16.127866" elapsed="0.005600"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.133904" 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-28T22:41:16.133542" elapsed="0.000395"/>
</kw>
<doc>验证货币价格转换接口功能</doc>
<tag>spot</tag>
<status status="PASS" start="2026-05-28T22:41:15.740092" elapsed="0.393949"/>
</test>
<test id="s1-s4-s1-s2-t2" name="获取单一货币价格转换" line="37">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.135300" 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-28T22:41:16.135142" elapsed="0.000179"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.136510" 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-28T22:41:16.136043" elapsed="0.000489"/>
</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-28T22:41:16.137106" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:16.136640" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:16.136617" elapsed="0.000570"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:16.137220" elapsed="0.000032"/>
</return>
<msg time="2026-05-28T22:41:16.137418" 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-28T22:41:16.135494" elapsed="0.001947"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:16.322341" 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-28T22:41:16.322693" 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 14:41: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-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'd9e203911f995e5d388e438e504d3cb4', 'X-Transparent': '00-d9e203911f995e5d388e438e504d3cb4-a74182bd6837839e-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': 'a02e04ec8b4485ca-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"uft":{"usd":"0.0088843354414123616"},"ksm":{"usd":"4.3922557238443136"},"vanry":{"usd":"0.004534005794932016448"},"pyth":{"usd":"0.0382325895961902752"},"bal":{"usd":"0.965298019308511648"},"fio":{"usd":"0.00093834554100310336"},"mbox":{"usd":"0.0105813433347158464"},"theta":{"usd":"0.180681428639959264"},"vib":{"usd":"0.00222607506003927712"},"fis":{"usd":"0.0190663828012332704"},"vic":{"usd":"0.040927837426731104"},"bar":{"usd":"0.360364617342681184"},"stpt":{"usd":"0.07029605638025376448"},"rad":{"usd":"0.25455118399552272"},"bat":{"usd":"0.1066120252969483392"},"cake":{"usd":"1.331652076274616896"},"ssv":{"usd":"2.341870892758809024"},"ape":{"usd":"0.1234822802362594528"},"qi":{"usd":"0.00147739510711126912"},"farm":{"usd":"5.7897916359765952"},"ctk":{"usd":"0.148737750648364256"},"band":{"usd":"0.186670868263383328"},"iotx":{"usd":"0.00391310055397038848"},"near":{"usd":"5.261722709178040224"},"shib":{"usd":"0.00000849502186588979744"},"xmr":{"usd":"118.4910805500727328"},"dock":{"usd":"0.0038931357552256416"},"astr":{"usd":"0.007114456032690550688"},"waves":{"usd":"1.074106172467382144"},"reef":{"usd":"0.000686789076819292672"},"iris":{"usd":"0.00520083007300656224"},"apt":{"usd":"0.915386022446644448"},"stg":{"usd":"0.1528305343910373664"},"ai":{"usd":"0.0235584625188013184"},"combo":{"usd":"0.0275514222677506944"},"dent":{"usd":"0.000037933117615019072"},"kda":{"usd":"0.005989439623424064"},"metis":{"usd":"3.01468461045677888"},"glm":{"usd":"0.1284734799224461728"},"loka":{"usd":"0.1234822802362594528"},"ray":{"usd":"0.701762675877852832"},"wld":{"usd":"0.2840990861377481024"},"agld":{"usd":"0.212625106631554272"},"iost":{"usd":"0.000996243457362869312"},"zro":{"usd":"1.117030489768587936"},"wing":{"usd":"0.325426219539374144"},"dgb":{"usd":"0.00321433259790424768"},"bb":{"usd":"0.026952478305408288"},"zrx":{"usd":"0.0991252257676682592"},"sui":{"usd":"0.9200777501516599648"},"bsw":{"usd":"0.0111802872970582528"},"omg":{"usd":"0.382325895961902752"},"blur":{"usd":"0.02033414752152469728"},"jst":{"usd":"0.09572122758168891616"},"pol":{"usd":"0.08761551929132168288"},"pivx":{"usd":"0.055901436485291264"},"gmt":{"usd":"0.01009220576546954784"},"nkn":{"usd":"0.0072871515418326112"},"porto":{"usd":"0.667822518011783136"},"rsr":{"usd":"0.001583208540458427584"},"sc":{"usd":"0.000867470505459251936"},"twt":{"usd":"0.4396248683593262976"},"arb":{"usd":"0.1016208256107616192"},"btc":{"usd":"69577.31364304350442656"},"cvc":{"usd":"0.02698242550352540832"},"ardr":{"usd":"0.03516799298887162912"},"vite":{"usd":"0.00085848634602411584"},"gmx":{"usd":"6.07928121777542496"},"sei":{"usd":"0.0681797877133105952"},"matic":{"usd":"0.3787322321878483136"},"audio":{"usd":"0.01834765004642238272"},"ark":{"usd":"0.1443454949245199424"},"cvp":{"usd":"0.0338403338723459616"},"key":{"usd":"0.001250794641358392032"},"btt":{"usd":"0"},"cvx":{"usd":"1.503349345479440064"},"flm":{"usd":"0.0166706069518636448"},"one":{"usd":"0.00176688468891009888"},"btx":{"usd":"0.1795833647089981856"},"ong":{"usd":"0.06085270657398849024"},"gno":{"usd":"112.32195773794594688"},"storj":{"usd":"0.097827513849259712"},"gns":{"usd":"0.461186851003652928"},"people":{"usd":"0.0061391756140096656"},"tnsr":{"usd":"0.0350382217970307744"},"bttc":{"usd":"0.00000030945438054357664"},"vtho":{"usd":"0.000470171010438789024"},"polyx":{"usd":"0.0482149889685637152"},"t":{"usd":"0.00471169250376026368"},"ont":{"usd":"0.05159902235579831136"},"mana":{"usd":"0.0826542668032520832"},"cfx":{"usd":"0.05121969117964812064"},"w":{"usd":"0.0110804633033345184"},"dodo":{"usd":"0.01784853007780371072"},"ankr":{"usd":"0.00440223812321668704"},"mina":{"usd":"0.0541046045982640448"},"sfp":{"usd":"0.2628365754745926752"},"dia":{"usd":"0.1596185659642513056"},"aca":{"usd":"0.0017968318870272192"},"algo":{"usd":"0.1049150174036448544"},"asr":{"usd":"0.991252257676682592"},"df":{"usd":"0.00163711349706924416"},"ast":{"usd":"0.0260540623618946784"},"jup":{"usd":"0.1714976212173756992"},"dusk":{"usd":"0.1219849203304034368"},"doge":{"usd":"0.09808705623294142144"},"bel":{"usd":"0.0942338500752052736"},"acm":{"usd":"0.353376937782019776"},"juv":{"usd":"0.391310055397038848"},"bome":{"usd":"0.000490135809183535904"},"tia":{"usd":"0.4138702779786028224"},"ata":{"usd":"0.0011978879246848128"},"nmr":{"usd":"8.25544428095283488"},"loom":{"usd":"0.04822497136793608864"},"paxg":{"usd":"4453.7473039781339904"},"lit":{"usd":"0.741692273367346592"},"woo":{"usd":"0.211626866694316928"},"rei":{"usd":"0.00400294214832174944"},"rare":{"usd":"0.014474479089941488"},"zec":{"usd":"524.83462940190598144"},"ren":{"usd":"0.04266477491752408256"},"atm":{"usd":"0.9732839388064104"},"hbar":{"usd":"0.0892925623858804208"},"rep":{"usd":"4.72167490313263712"},"elf":{"usd":"0.2268001137403245568"},"pepe":{"usd":"0.00000332413899100035552"},"icx":{"usd":"0.0353376937782019776"},"req":{"usd":"0.0694774996317191424"},"xai":{"usd":"0.00927364901693492576"},"strax":{"usd":"0.0114298472813675888"},"chess":{"usd":"0.00280505422363693664"},"tusd":{"usd":"0.9980402892498965312"},"ctsi":{"usd":"0.02692253110729116768"},"sxp":{"usd":"0.0021961278619221568"},"rvn":{"usd":"0.00505109408242096064"},"chr":{"usd":"0.01892662921002004224"},"fida":{"usd":"0.02773110545645341632"},"ntrn":{"usd":"0.0015971838995797504"},"sand":{"usd":"0.06656263901498609792"},"osmo":{"usd":"0.0556019645041200608"},"kava":{"usd":"0.05362544942839011968"},"ocean":{"usd":"0.6112223135704257312"},"vidt":{"usd":"0.0011479759278229456"},"adx":{"usd":"0.0571991484036998112"},"chz":{"usd":"0.03404996425916580384"},"xrp":{"usd":"2.1339375138322702688"},"c98":{"usd":"0.018966558807509536"},"psg":{"usd":"1.120025209580299968"},"perp":{"usd":"0.124779992154668"},"for":{"usd":"0.00305461420794627264"},"uma":{"usd":"0.41926077363968448"},"syn":{"usd":"0.0401292454769412288"},"jasmy":{"usd":"0.00546037245668827168"},"sys":{"usd":"0.00222607506003927712"},"lunc":{"usd":"0.00008207528763965442368"},"luna":{"usd":"0.0585966843158320928"},"auction":{"usd":"4.40223812321668704"},"not":{"usd":"0.00042924317301205792"},"gal":{"usd":"2.537525920457328448"},"yfii":{"usd":"434.733492666863312"},"alpha":{"usd":"0.0096829273912022368"},"tko":{"usd":"0.0506107648179333408"},"pixel":{"usd":"0.00636877079957425472"},"nexo":{"usd":"0.815562028722910048"},"bico":{"usd":"0.0227598705690114432"},"troy":{"usd":"0.000068878555669376736"},"mask":{"usd":"0.426248453200345888"},"enj":{"usd":"0.03832243119054163616"},"aave":{"usd":"79.56970539718869024"},"wan":{"usd":"0.0542044285919877792"},"gm":{"usd":"713.2923471529441552"},"oax":{"usd":"0.0357369897530969152"},"btxtest2":{"usd":"0.3681508888531324672"},"orn":{"usd":"1.051146653910923232"},"ens":{"usd":"5.67998524288048736"},"pda":{"usd":"0.00975280418680885088"},"bond":{"usd":"2.148212344934764288"},"tlm":{"usd":"0.001361599274391737216"},"kp3r":{"usd":"16.45099416567142912"},"lqty":{"usd":"0.23458638525077584"},"ckb":{"usd":"0.001234822802362594528"},"bigtime":{"usd":"0.01095069211149366368"},"yfi":{"usd":"2253.027538344685408"},"xtz":{"usd":"0.308456140606339296"},"dexe":{"usd":"16.8702549393111136"},"meme":{"usd":"0.000470171010438789024"},"dego":{"usd":"0.027950718242645632"},"eos":{"usd":"0.7785273270514045856"},"alice":{"usd":"0.1178921365877303264"},"ooki":{"usd":"0.000118790552531243936"},"rif":{"usd":"0.068379435700758064"},"rune":{"usd":"0.41426957395349776"},"hook":{"usd":"0.0077862715104512832"},"skl":{"usd":"0.00556019645041200608"},"alpaca":{"usd":"0.2240050419160599936"},"tom2":{"usd":"697.50019134584937312"},"gtc":{"usd":"0.092836314163072992"},"tom3":{"usd":"697.43031455024275904"},"xec":{"usd":"0.0000066882075794902048"},"ygg":{"usd":"0.03398008746355918976"},"1inch":{"usd":"0.0844510986902793024"},"id":{"usd":"0.0260540623618946784"},"portal":{"usd":"0.00755667632488669408"},"zil":{"usd":"0.00370347016715054624"},"axs":{"usd":"1.097065691023841056"},"btxtest":{"usd":"0.093834554100310336"},"comp":{"usd":"17.68881168784573568"},"io":{"usd":"0.1583208540458427584"},"xvg":{"usd":"0.003080568446314443584"},"iq":{"usd":"0.001016208256107616192"},"pundix":{"usd":"0.1320671436965006112"},"unfi":{"usd":"1.338639755835278304"},"cream":{"usd":"2.0963038681984224"},"forth":{"usd":"0.236582865125250528"},"clv":{"usd":"0.02931830695666079328"},"powr":{"usd":"0.0587963323032795616"},"zk":{"usd":"0.01314681997341582048"},"ctxc":{"usd":"0.0632884120208476096"},"ghst":{"usd":"0.107809913221633152"},"xvs":{"usd":"2.61538863556184128"},"slp":{"usd":"0.000601938682154118432"},"hft":{"usd":"0.010481519340992112"},"beamx":{"usd":"0.001654083576002279008"},"idex":{"usd":"0.00198649747510231456"},"hive":{"usd":"0.056899676422528608"},"kmd":{"usd":"0.0162713109769687072"},"city":{"usd":"0.425250213263108544"},"steem":{"usd":"0.05043108162923061888"},"celr":{"usd":"0.002301941295269315264"},"dot":{"usd":"7.298132181142221984"},"celo":{"usd":"0.07188325788046114144"},"rdnt":{"usd":"0.00327422699413848832"},"ton":{"usd":"1.740930450541927936"},"pros":{"usd":"0.0371345256652291968"},"prom":{"usd":"1.042162494475787136"},"ftm":{"usd":"0.6981690121037983936"},"knc":{"usd":"0.1355609834768313152"},"mav":{"usd":"0.01224840402990221088"},"bifi":{"usd":"32.0435019853187424"},"ftt":{"usd":"0.2922846536230943232"},"rlc":{"usd":"0.427246693137583232"},"pha":{"usd":"0.0403288934643886976"},"manta":{"usd":"0.08063782213003264832"},"phb":{"usd":"0.01497359905856016"},"xaut":{"usd":"4446.909360408058184"},"blz":{"usd":"0.0580975643472134208"},"lpt":{"usd":"2.067354910018539424"},"gft":{"usd":"0.00195655027698519424"},"api3":{"usd":"0.300969341077059216"},"voxel":{"usd":"0.013975359121322816"},"waxp":{"usd":"0.00582972123346608896"},"mbl":{"usd":"0.000836525067404894272"},"snt":{"usd":"0.0271521262928557568"},"glmr":{"usd":"0.0118790552531243936"},"rose":{"usd":"0.00902408903262558976"},"snx":{"usd":"0.296477261359491168"},"atom":{"usd":"2.02642707259180832"},"fun":{"usd":"0.000341398058535171648"},"arkm":... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-28T22:41:16.322955" 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-28T22:41:16.323149" 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-28T22:41:16.137534" elapsed="0.185646"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.324339" 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-28T22:41:16.323453" elapsed="0.001061"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.326570" level="INFO">${resp_json} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'uft': {'usd': '0.0088843354414123616'}, 'ksm': {'usd': '4.3922557238443136'}, 'vanry': {'usd': '0.004534005794932016448'}, 'pyth': {'usd': '0.038...</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-28T22:41:16.324849" elapsed="0.001824"/>
</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-28T22:41:16.327065" elapsed="0.000455"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.330989" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "uft": {
      "usd": "0.0088843354414123616"
    },
    "ksm": {
      "usd": "4.3922557238443136"
    },
    "vanry": {
      "usd...</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-28T22:41:16.327851" elapsed="0.003338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.331813" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "uft": {
      "usd": "0.0088843354414123616"
    },
    "ksm": {
      "usd": "4.3922557238443136"
    },
    "vanry": {
      "usd": "0.004534005794932016448"
    },
    "pyth": {
      "usd": "0.0382325895961902752"
    },
    "bal": {
      "usd": "0.965298019308511648"
    },
    "fio": {
      "usd": "0.00093834554100310336"
    },
    "mbox": {
      "usd": "0.0105813433347158464"
    },
    "theta": {
      "usd": "0.180681428639959264"
    },
    "vib": {
      "usd": "0.00222607506003927712"
    },
    "fis": {
      "usd": "0.0190663828012332704"
    },
    "vic": {
      "usd": "0.040927837426731104"
    },
    "bar": {
      "usd": "0.360364617342681184"
    },
    "stpt": {
      "usd": "0.07029605638025376448"
    },
    "rad": {
      "usd": "0.25455118399552272"
    },
    "bat": {
      "usd": "0.1066120252969483392"
    },
    "cake": {
      "usd": "1.331652076274616896"
    },
    "ssv": {
      "usd": "2.341870892758809024"
    },
    "ape": {
      "usd": "0.1234822802362594528"
    },
    "qi": {
      "usd": "0.00147739510711126912"
    },
    "farm": {
      "usd": "5.7897916359765952"
    },
    "ctk": {
      "usd": "0.148737750648364256"
    },
    "band": {
      "usd": "0.186670868263383328"
    },
    "iotx": {
      "usd": "0.00391310055397038848"
    },
    "near": {
      "usd": "5.261722709178040224"
    },
    "shib": {
      "usd": "0.00000849502186588979744"
    },
    "xmr": {
      "usd": "118.4910805500727328"
    },
    "dock": {
      "usd": "0.0038931357552256416"
    },
    "astr": {
      "usd": "0.007114456032690550688"
    },
    "waves": {
      "usd": "1.074106172467382144"
    },
    "reef": {
      "usd": "0.000686789076819292672"
    },
    "iris": {
      "usd": "0.00520083007300656224"
    },
    "apt": {
      "usd": "0.915386022446644448"
    },
    "stg": {
      "usd": "0.1528305343910373664"
    },
    "ai": {
      "usd": "0.0235584625188013184"
    },
    "combo": {
      "usd": "0.0275514222677506944"
    },
    "dent": {
      "usd": "0.000037933117615019072"
    },
    "kda": {
      "usd": "0.005989439623424064"
    },
    "metis": {
      "usd": "3.01468461045677888"
    },
    "glm": {
      "usd": "0.1284734799224461728"
    },
    "loka": {
      "usd": "0.1234822802362594528"
    },
    "ray": {
      "usd": "0.701762675877852832"
    },
    "wld": {
      "usd": "0.2840990861377481024"
    },
    "agld": {
      "usd": "0.212625106631554272"
    },
    "iost": {
      "usd": "0.000996243457362869312"
    },
    "zro": {
      "usd": "1.117030489768587936"
    },
    "wing": {
      "usd": "0.325426219539374144"
    },
    "dgb": {
      "usd": "0.00321433259790424768"
    },
    "bb": {
      "usd": "0.026952478305408288"
    },
    "zrx": {
      "usd": "0.0991252257676682592"
    },
    "sui": {
      "usd": "0.9200777501516599648"
    },
    "bsw": {
      "usd": "0.0111802872970582528"
    },
    "omg": {
      "usd": "0.382325895961902752"
    },
    "blur": {
      "usd": "0.02033414752152469728"
    },
    "jst": {
      "usd": "0.09572122758168891616"
    },
    "pol": {
      "usd": "0.08761551929132168288"
    },
    "pivx": {
      "usd": "0.055901436485291264"
    },
    "gmt": {
      "usd": "0.01009220576546954784"
    },
    "nkn": {
      "usd": "0.0072871515418326112"
    },
    "porto": {
      "usd": "0.667822518011783136"
    },
    "rsr": {
      "usd": "0.001583208540458427584"
    },
    "sc": {
      "usd": "0.000867470505459251936"
    },
    "twt": {
      "usd": "0.4396248683593262976"
    },
    "arb": {
      "usd": "0.1016208256107616192"
    },
    "btc": {
      "usd": "69577.31364304350442656"
    },
    "cvc": {
      "usd": "0.02698242550352540832"
    },
    "ardr": {
      "usd": "0.03516799298887162912"
    },
    "vite": {
      "usd": "0.00085848634602411584"
    },
    "gmx": {
      "usd": "6.07928121777542496"
    },
    "sei": {
      "usd": "0.0681797877133105952"
    },
    "matic": {
      "usd": "0.3787322321878483136"
    },
    "audio": {
      "usd": "0.01834765004642238272"
    },
    "ark": {
      "usd": "0.1443454949245199424"
    },
    "cvp": {
      "usd": "0.0338403338723459616"
    },
    "key": {
      "usd": "0.001250794641358392032"
    },
    "btt": {
      "usd": "0"
    },
    "cvx": {
      "usd": "1.503349345479440064"
    },
    "flm": {
      "usd": "0.0166706069518636448"
    },
    "one": {
      "usd": "0.00176688468891009888"
    },
    "btx": {
      "usd": "0.1795833647089981856"
    },
    "ong": {
      "usd": "0.06085270657398849024"
    },
    "gno": {
      "usd": "112.32195773794594688"
    },
    "storj": {
      "usd": "0.097827513849259712"
    },
    "gns": {
      "usd": "0.461186851003652928"
    },
    "people": {
      "usd": "0.0061391756140096656"
    },
    "tnsr": {
      "usd": "0.0350382217970307744"
    },
    "bttc": {
      "usd": "0.00000030945438054357664"
    },
    "vtho": {
      "usd": "0.000470171010438789024"
    },
    "polyx": {
      "usd": "0.0482149889685637152"
    },
    "t": {
      "usd": "0.00471169250376026368"
    },
    "ont": {
      "usd": "0.05159902235579831136"
    },
    "mana": {
      "usd": "0.0826542668032520832"
    },
    "cfx": {
      "usd": "0.05121969117964812064"
    },
    "w": {
      "usd": "0.0110804633033345184"
    },
    "dodo": {
      "usd": "0.01784853007780371072"
    },
    "ankr": {
      "usd": "0.00440223812321668704"
    },
    "mina": {
      "usd": "0.0541046045982640448"
    },
    "sfp": {
      "usd": "0.2628365754745926752"
    },
    "dia": {
      "usd": "0.1596185659642513056"
    },
    "aca": {
      "usd": "0.0017968318870272192"
    },
    "algo": {
      "usd": "0.1049150174036448544"
    },
    "asr": {
      "usd": "0.991252257676682592"
    },
    "df": {
      "usd": "0.00163711349706924416"
    },
    "ast": {
      "usd": "0.0260540623618946784"
    },
    "jup": {
      "usd": "0.1714976212173756992"
    },
    "dusk": {
      "usd": "0.1219849203304034368"
    },
    "doge": {
      "usd": "0.09808705623294142144"
    },
    "bel": {
      "usd": "0.0942338500752052736"
    },
    "acm": {
      "usd": "0.353376937782019776"
    },
    "juv": {
      "usd": "0.391310055397038848"
    },
    "bome": {
      "usd": "0.000490135809183535904"
    },
    "tia": {
      "usd": "0.4138702779786028224"
    },
    "ata": {
      "usd": "0.0011978879246848128"
    },
    "nmr": {
      "usd": "8.25544428095283488"
    },
    "loom": {
      "usd": "0.04822497136793608864"
    },
    "paxg": {
      "usd": "4453.7473039781339904"
    },
    "lit": {
      "usd": "0.741692273367346592"
    },
    "woo": {
      "usd": "0.211626866694316928"
    },
    "rei": {
      "usd": "0.00400294214832174944"
    },
    "rare": {
      "usd": "0.014474479089941488"
    },
    "zec": {
      "usd": "524.83462940190598144"
    },
    "ren": {
      "usd": "0.04266477491752408256"
    },
    "atm": {
      "usd": "0.9732839388064104"
    },
    "hbar": {
      "usd": "0.0892925623858804208"
    },
    "rep": {
      "usd": "4.72167490313263712"
    },
    "elf": {
      "usd": "0.2268001137403245568"
    },
    "pepe": {
      "usd": "0.00000332413899100035552"
    },
    "icx": {
      "usd": "0.0353376937782019776"
    },
    "req": {
      "usd": "0.0694774996317191424"
    },
    "xai": {
      "usd": "0.00927364901693492576"
    },
    "strax": {
      "usd": "0.0114298472813675888"
    },
    "chess": {
      "usd": "0.00280505422363693664"
    },
    "tusd": {
      "usd": "0.9980402892498965312"
    },
    "ctsi": {
      "usd": "0.02692253110729116768"
    },
    "sxp": {
      "usd": "0.0021961278619221568"
    },
    "rvn": {
      "usd": "0.00505109408242096064"
    },
    "chr": {
      "usd": "0.01892662921002004224"
    },
    "fida": {
      "usd": "0.02773110545645341632"
    },
    "ntrn": {
      "usd": "0.0015971838995797504"
    },
    "sand": {
      "usd": "0.06656263901498609792"
    },
    "osmo": {
      "usd": "0.0556019645041200608"
    },
    "kava": {
      "usd": "0.05362544942839011968"
    },
    "ocean": {
      "usd": "0.6112223135704257312"
    },
    "vidt": {
      "usd": "0.0011479759278229456"
    },
    "adx": {
      "usd": "0.0571991484036998112"
    },
    "chz": {
      "usd": "0.03404996425916580384"
    },
    "xrp": {
      "usd": "2.1339375138322702688"
    },
    "c98": {
      "usd": "0.018966558807509536"
    },
    "psg": {
      "usd": "1.120025209580299968"
    },
    "perp": {
      "usd": "0.124779992154668"
    },
    "for": {
      "usd": "0.00305461420794627264"
    },
    "uma": {
      "usd": "0.41926077363968448"
    },
    "syn": {
      "usd": "0.0401292454769412288"
    },
    "jasmy": {
      "usd": "0.00546037245668827168"
    },
    "sys": {
      "usd": "0.00222607506003927712"
    },
    "lunc": {
      "usd": "0.00008207528763965442368"
    },
    "luna": {
      "usd": "0.0585966843158320928"
    },
    "auction": {
      "usd": "4.40223812321668704"
    },
    "not": {
      "usd": "0.00042924317301205792"
    },
    "gal": {
      "usd": "2.537525920457328448"
    },
    "yfii": {
      "usd": "434.733492666863312"
    },
    "alpha": {
      "usd": "0.0096829273912022368"
    },
    "tko": {
      "usd": "0.0506107648179333408"
    },
    "pixel": {
      "usd": "0.00636877079957425472"
    },
    "nexo": {
      "usd": "0.815562028722910048"
    },
    "bico": {
      "usd": "0.0227598705690114432"
    },
    "troy": {
      "usd": "0.000068878555669376736"
    },
    "mask": {
      "usd": "0.426248453200345888"
    },
    "enj": {
      "usd": "0.03832243119054163616"
    },
    "aave": {
      "usd": "79.56970539718869024"
    },
    "wan": {
      "usd": "0.0542044285919877792"
    },
    "gm": {
      "usd": "713.2923471529441552"
    },
    "oax": {
      "usd": "0.0357369897530969152"
    },
    "btxtest2": {
      "usd": "0.3681508888531324672"
    },
    "orn": {
      "usd": "1.051146653910923232"
    },
    "ens": {
      "usd": "5.67998524288048736"
    },
    "pda": {
      "usd": "0.00975280418680885088"
    },
    "bond": {
      "usd": "2.148212344934764288"
    },
    "tlm": {
      "usd": "0.001361599274391737216"
    },
    "kp3r": {
      "usd": "16.45099416567142912"
    },
    "lqty": {
      "usd": "0.23458638525077584"
    },
    "ckb": {
      "usd": "0.001234822802362594528"
    },
    "bigtime": {
      "usd": "0.01095069211149366368"
    },
    "yfi": {
      "usd": "2253.027538344685408"
    },
    "xtz": {
      "usd": "0.308456140606339296"
    },
    "dexe": {
      "usd": "16.8702549393111136"
    },
    "meme": {
      "usd": "0.000470171010438789024"
    },
    "dego": {
      "usd": "0.027950718242645632"
    },
    "eos": {
      "usd": "0.7785273270514045856"
    },
    "alice": {
      "usd": "0.1178921365877303264"
    },
    "ooki": {
      "usd": "0.000118790552531243936"
    },
    "rif": {
      "usd": "0.068379435700758064"
    },
    "rune": {
      "usd": "0.41426957395349776"
    },
    "hook": {
      "usd": "0.0077862715104512832"
    },
    "skl": {
      "usd": "0.00556019645041200608"
    },
    "alpaca": {
      "usd": "0.2240050419160599936"
    },
    "tom2": {
      "usd": "697.50019134584937312"
    },
    "gtc": {
      "usd": "0.092836314163072992"
    },
    "tom3": {
      "usd": "697.43031455024275904"
    },
    "xec": {
      "usd": "0.0000066882075794902048"
    },
    "ygg": {
      "usd": "0.03398008746355918976"
    },
    "1inch": {
      "usd": "0.0844510986902793024"
    },
    "id": {
      "usd": "0.0260540623618946784"
    },
    "portal": {
      "usd": "0.00755667632488669408"
    },
    "zil": {
      "usd": "0.00370347016715054624"
    },
    "axs": {
      "usd": "1.097065691023841056"
    },
    "btxtest": {
      "usd": "0.093834554100310336"
    },
    "comp": {
      "usd": "17.68881168784573568"
    },
    "io": {
      "usd": "0.1583208540458427584"
    },
    "xvg": {
      "usd": "0.003080568446314443584"
    },
    "iq": {
      "usd": "0.001016208256107616192"
    },
    "pundix": {
      "usd": "0.1320671436965006112"
    },
    "unfi": {
      "usd": "1.338639755835278304"
    },
    "cream": {
      "usd": "2.0963038681984224"
    },
    "forth": {
      "usd": "0.236582865125250528"
    },
    "clv": {
      "usd": "0.02931830695666079328"
    },
    "powr": {
      "usd": "0.0587963323032795616"
    },
    "zk": {
      "usd": "0.01314681997341582048"
    },
    "ctxc": {
      "usd": "0.0632884120208476096"
    },
    "ghst": {
      "usd": "0.107809913221633152"
    },
    "xvs": {
      "usd": "2.61538863556184128"
    },
    "slp": {
      "usd": "0.000601938682154118432"
    },
    "hft": {
      "usd": "0.010481519340992112"
    },
    "beamx": {
      "usd": "0.001654083576002279008"
    },
    "idex": {
      "usd": "0.00198649747510231456"
    },
    "hive": {
      "usd": "0.056899676422528608"
    },
    "kmd": {
      "usd": "0.0162713109769687072"
    },
    "city": {
      "usd": "0.425250213263108544"
    },
    "steem": {
      "usd": "0.05043108162923061888"
    },
    "celr": {
      "usd": "0.002301941295269315264"
    },
    "dot": {
      "usd": "7.298132181142221984"
    },
    "celo": {
      "usd": "0.07188325788046114144"
    },
    "rdnt": {
      "usd": "0.00327422699413848832"
    },
    "ton": {
      "usd": "1.740930450541927936"
    },
    "pros": {
      "usd": "0.0371345256652291968"
    },
    "prom": {
      "usd": "1.042162494475787136"
    },
    "ftm": {
      "usd": "0.6981690121037983936"
    },
    "knc": {
      "usd": "0.1355609834768313152"
    },
    "mav": {
      "usd": "0.01224840402990221088"
    },
    "bifi": {
      "usd": "32.0435019853187424"
    },
    "ftt": {
      "usd": "0.2922846536230943232"
    },
    "rlc": {
      "usd": "0.427246693137583232"
    },
    "pha": {
      "usd": "0.0403288934643886976"
    },
    "manta": {
      "usd": "0.08063782213003264832"
    },
    "phb": {
      "usd": "0.01497359905856016"
    },
    "xaut": {
      "usd": "4446.909360408058184"
    },
    "blz": {
      "usd": "0.0580975643472134208"
    },
    "lpt": {
      "usd": "2.067354910018539424"
    },
    "gft": {
      "usd": "0.00195655027698519424"
    },
    "api3": {
      "usd": "0.300969341077059216"
    },
    "voxel": {
      "usd": "0.013975359121322816"
    },
    "waxp": {
      "usd": "0.00582972123346608896"
    },
    "mbl": {
      "usd": "0.000836525067404894272"
    },
    "snt": {
      "usd": "0.0271521262928557568"
    },
    "glmr": {
      "usd": "0.0118790552531243936"
    },
    "rose": {
      "usd": "0.00902408903262558976"
    },
    "snx": {
      "usd": "0.296477261359491168"
    },
    "atom": {
      "usd": "2.02642707259180832"
    },
    "fun": {
      "usd": "0.000341398058535171648"
    },
    "arkm": {
      "usd": "0.1318674957090531424"
    },
    "magic": {
      "usd": "0.0561010844727387328"
    },
    "quick": {
      "usd": "0.0078860955041750176"
    },
    "data": {
      "usd": "0.00087845114476886272"
    },
    "cos": {
      "usd": "0.001181916085689015296"
    },
    "usd": {
      "usd": "1"
    },
    "qkc": {
      "usd": "0.002704231989975964896"
    },
    "pyr": {
      "usd": "0.230593425501826464"
    },
    "dai": {
      "usd": "0"
    },
    "sol": {
      "usd": "85.75879300806022304"
    },
    "high": {
      "usd": "0.126776472029142688"
    },
    "burger": {
      "usd": "0.0171697269204823168"
    },
    "lazio": {
      "usd": "0.49412876893248528"
    },
    "dar": {
      "usd": "0.21668794317611026208"
    },
    "etc": {
      "usd": "8.14563788785672704"
    },
    "ogn": {
      "usd": "0.02045393631399317856"
    },
    "bnb": {
      "usd": "0"
    },
    "usdt": {
      "usd": "0.998239937237344"
    },
    "eth": {
      "usd": "1986.46752790419743968"
    },
    "neo": {
      "usd": "2.668295352235420512"
    },
    "lrc": {
      "usd": "0.01875692842068969376"
    },
    "ordi": {
      "usd": "26.74284791858844576"
    },
    "saga": {
      "usd": "0.01777865328219709664"
    },
    "usdn": {
      "usd": "0.998239937237344"
    },
    "pengu": {
      "usd": "0.00769143871641373552"
    },
    "lista": {
      "usd": "0.0627892920522289376"
    },
    "spell": {
      "usd": "0.000145743030836652224"
    },
    "tao": {
      "usd": "257.3462558197872832"
    },
    "mtl": {
      "usd": "0.273517742803032256"
    },
    "trb": {
      "usd": "16.31124057445820096"
    },
    "alt": {
      "usd": "0.00686789076819292672"
    },
    "bnt": {
      "usd": "0.3202353718657399552"
    },
    "oxt": {
      "usd": "0.0093834554100310336"
    },
    "lever": {
      "usd": "0.0001746919890165352"
    },
    "usdc": {
      "usd": "0.99950770195763542688"
    },
    "utk": {
      "usd": "0.0079360075010368848"
    },
    "bnx": {
      "usd": "1.7787637441632232736"
    },
    "aergo": {
      "usd": "0.063388236014571344"
    },
    "ilv": {
      "usd": "3.91310055397038848"
    },
    "hifi": {
      "usd": "0.126776472029142688"
    },
    "egld": {
      "usd": "3.52378697844782432"
    },
    "tru": {
      "usd": "0.0022959518556458912"
    },
    "alpine": {
      "usd": "0.421257253514159168"
    },
    "amb": {
      "usd": "0.00031943677991595008"
    },
    "edu": {
      "usd": "0.0431239652886532608"
    },
    "nfp": {
      "usd": "0.00920377222132831168"
    },
    "ustc": {
      "usd": "0.00600940442216881088"
    },
    "trx": {
      "usd": "0.3489846820581754624"
    },
    "dash": {
      "usd": "38.84151595790505504"
    },
    "nuls": {
      "usd": "0.0257545903807234752"
    },
    "mdx": {
      "usd": "0.034439277834688368"
    },
    "joe": {
      "usd": "0.0376336456338478688"
    },
    "pond": {
      "usd": "0.00172695509142060512"
    },
    "lina": {
      "usd": "0.000336406858848984928"
    },
    "lsk": {
      "usd": "0.107809913221633152"
    },
    "amp": {
      "usd": "0.000727716914246023776"
    },
    "pendle": {
      "usd": "1.48238630679745584"
    },
    "dydx": {
      "usd": "0.14677121797200668832"
    },
    "busd": {
      "usd": "0.9985394092185152032"
    },
    "akro": {
      "usd": "0.000979273378429834464"
    },
    "alcx": {
      "usd": "3.97299495020462912"
    },
    "qtum": {
      "usd": "0.8485039466517424"
    },
    "arpa": {
      "usd": "0.00982268098241546496"
    },
    "coti": {
      "usd": "0.01125016409266486688"
    },
    "dcr": {
      "usd": "16.2713109769687072"
    },
    "og": {
      "usd": "2.76013342646125616"
    },
    "ethfi": {
      "usd": "0.36435757709163056"
    },
    "flux": {
      "usd": "0.0659836598513884384"
    },
    "ltc": {
      "usd": "129.18223027788468704"
    },
    "win": {
      "usd": "0.00001908634759997801728"
    },
    "beta": {
      "usd": "0.00035936637740544384"
    },
    "om": {
      "usd": "0.0667822518011783136"
    },
    "fxs": {
      "usd": "0.810570829036723328"
    },
    "pla": {
      "usd": "0.2342869132696046368"
    },
    "ant": {
      "usd": "7.393963215117007008"
    },
    "vgx": {
      "usd": "0.017968318870272192"
    },
    "lto": {
      "usd": "0.0037933117615019072"
    },
    "crv": {
      "usd": "0.2097302108135659744"
    },
    "aeur": {
      "usd": "1.1482753998041168032"
    },
    "movr": {
      "usd": "1.734941010918503872"
    },
    "srm": {
      "usd": "0.24398980545955162048"
    },
    "badger": {
      "usd": "0.760658832174856128"
    },
    "rpl": {
      "usd": "1.5971838995797504"
    },
    "super": {
      "usd": "0.1090078011463179648"
    },
    "aevo": {
      "usd": "0.022959518556458912"
    },
    "pols": {
      "usd": "0.3073580766753782176"
    },
    "cyber": {
      "usd": "0.432237892823769952"
    },
    "qnt": {
      "usd": "69.79693641163509248"
    },
    "ldo": {
      "usd": "0.317939420010094064"
    },
    "bake": {
      "usd": "0.0518086527426181536"
    },
    "agix": {
      "usd": "0.6130191454574529504"
    },
    "xlm": {
      "usd": "0.2008458753721536128"
    },
    "stmx": {
      "usd": "0.00455696531348847536"
    },
    "front": {
      "usd": "0.87845114476886272"
    },
    "gala": {
      "usd": "0.002994719811712032"
    },
    "rndr": {
      "usd": "7.01762675877852832"
    }
  },
  "ts": 1779979276301
}</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-28T22:41:16.331460" elapsed="0.001018"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:16.334210" level="INFO">${data} = {'uft': {'usd': '0.0088843354414123616'}, 'ksm': {'usd': '4.3922557238443136'}, 'vanry': {'usd': '0.004534005794932016448'}, 'pyth': {'usd': '0.0382325895961902752'}, 'bal': {'usd': '0.965298019308511...</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-28T22:41:16.332696" elapsed="0.001563"/>
</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-28T22:41:16.334454" elapsed="0.000419"/>
</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-28T22:41:16.335039" elapsed="0.000205"/>
</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-28T22:41:16.336451" elapsed="0.000420"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T22:41:16.337424" 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-28T22:41:16.337053" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.337876" 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-28T22:41:16.337633" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:16.338465" 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-28T22:41:16.338222" elapsed="0.000335">Dictionary does not contain key 'rates'.</status>
</kw>
<msg time="2026-05-28T22:41:16.338695" 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-28T22:41:16.338088" elapsed="0.000633"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:16.339684" 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-28T22:41:16.339114" elapsed="0.000689">Dictionary does not contain key 'base'.</status>
</kw>
<msg time="2026-05-28T22:41:16.340043" 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-28T22:41:16.338909" elapsed="0.001175"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:16.340893" 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-28T22:41:16.340541" elapsed="0.000451">Dictionary does not contain key 'timestamp'.</status>
</kw>
<msg time="2026-05-28T22:41:16.341105" 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-28T22:41:16.340341" elapsed="0.000785"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:16.341533" 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-28T22:41:16.341382" elapsed="0.000198">Dictionary does not contain key 'date'.</status>
</kw>
<msg time="2026-05-28T22:41:16.341666" 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-28T22:41:16.341246" elapsed="0.000546"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:16.342208" 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-28T22:41:16.342042" elapsed="0.000221">Dictionary does not contain key 'success'.</status>
</kw>
<msg time="2026-05-28T22:41:16.342358" 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-28T22:41:16.341915" elapsed="0.000465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.342737" 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-28T22:41:16.342558" elapsed="0.000227"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.342991" 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-28T22:41:16.342879" elapsed="0.000150"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.343298" 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-28T22:41:16.343136" elapsed="0.000212"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.343584" 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-28T22:41:16.343464" elapsed="0.000157"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.343819" 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-28T22:41:16.343715" elapsed="0.000139"/>
</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-28T22:41:16.343961" elapsed="0.000101"/>
</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-28T22:41:16.344156" elapsed="0.000084"/>
</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-28T22:41:16.344334" elapsed="0.000087"/>
</kw>
<arg>${data}</arg>
<doc>验证价格转换字典的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:16.335910" elapsed="0.008599"/>
</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-28T22:41:16.335391" elapsed="0.009168"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.345449" 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-28T22:41:16.344673" elapsed="0.000846"/>
</kw>
<doc>验证单一货币价格转换接口功能</doc>
<tag>spot</tag>
<status status="PASS" start="2026-05-28T22:41:16.134200" elapsed="0.211530"/>
</test>
<doc>货币价格转换接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:15.730664" elapsed="0.615601"/>
</suite>
<status status="PASS" start="2026-05-28T22:41:15.304264" elapsed="1.044035"/>
</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-28T22:41:16.355404" 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-28T22:41:16.354913" elapsed="0.000565"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.356332" 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-28T22:41:16.356056" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:16.355649" elapsed="0.000792"/>
</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-28T22:41:16.356600" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:16.356472" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:16.355607" elapsed="0.001067"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.357478" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:16.357343" elapsed="0.000185"/>
</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-28T22:41:16.357776" 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-28T22:41:16.357897" 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-28T22:41:16.358013" 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-28T22:41:16.358121" 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-28T22:41:16.358228" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:16.357599" elapsed="0.000719"/>
</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-28T22:41:16.358550" 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-28T22:41:16.358680" 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-28T22:41:16.358794" 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-28T22:41:16.358900" 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-28T22:41:16.359005" 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-28T22:41:16.359109" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:16.359211" 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-28T22:41:16.359315" 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-28T22:41:16.359418" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:16.358361" elapsed="0.001103"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.359834" 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-28T22:41:16.359570" elapsed="0.000309"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.360179" 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-28T22:41:16.359983" elapsed="0.000235"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.360511" 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-28T22:41:16.360316" elapsed="0.000233"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.360818" 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-28T22:41:16.360644" elapsed="0.000206"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.361118" 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-28T22:41:16.360949" elapsed="0.000202"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.361406" 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-28T22:41:16.361235" elapsed="0.000203"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.361702" 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-28T22:41:16.361524" elapsed="0.000210"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.362007" 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-28T22:41:16.361830" elapsed="0.000209"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.362303" 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-28T22:41:16.362123" elapsed="0.000211"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:16.359486" elapsed="0.002876"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:16.357581" elapsed="0.004799"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.362589" 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-28T22:41:16.362456" elapsed="0.000169"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:16.363049" 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-28T22:41:16.362716" elapsed="0.000643"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:16.357053" elapsed="0.006375"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.363595" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:16.363517" elapsed="0.000112"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:16.354663" elapsed="0.009013"/>
</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-28T22:41:16.369143" 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-28T22:41:16.368509" elapsed="0.000667"/>
</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-28T22:41:16.369817" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:16.369333" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:16.369309" elapsed="0.000583"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:16.369922" elapsed="0.000030"/>
</return>
<msg time="2026-05-28T22:41:16.370111" 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-28T22:41:16.367687" elapsed="0.002448"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:16.628960" 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-28T22:41:16.629464" 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 14:41: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-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'cd44ba666aad9fdb86a4ab2d60091443', 'X-Transparent': '00-cd44ba666aad9fdb86a4ab2d60091443-6960446e5ed294e7-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': 'a02e04ee8df80f00-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":1779979276124,"cv":"-2119.81","cr":"-0.0282","o":"75095.82","l":"72592.37","h":"75502.29","c":"72976.01","q":"1766.468060","v":"130311004.1522"},{"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":1779979270608,"cv":"0.0000","cr":"0.0000","o":"0.1799","l":"0.1799","h":"0.1800","c":"0.1799","q":"18116530.1","v":"3259916.42953"},{"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":1779979276614} 
 </msg>
<msg time="2026-05-28T22:41:16.630018" 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-28T22:41:16.630341" 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-28T22:41:16.370231" elapsed="0.260154"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.631729" 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-28T22:41:16.630695" elapsed="0.001178"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.633052" 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-28T22:41:16.632233" elapsed="0.000928"/>
</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-28T22:41:16.633413" elapsed="0.000185"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.634493" 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-28T22:41:16.633710" elapsed="0.000822"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.634938" 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": 1779979276124,
      "cv": "-2119.81",
      "cr": "-0.0282",
      "o": "75095.82",
      "l": "72592.37",
      "h": "75502.29",
      "c": "72976.01",
      "q": "1766.468060",
      "v": "130311004.1522"
    },
    {
      "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": 1779979270608,
      "cv": "0.0000",
      "cr": "0.0000",
      "o": "0.1799",
      "l": "0.1799",
      "h": "0.1800",
      "c": "0.1799",
      "q": "18116530.1",
      "v": "3259916.42953"
    },
    {
      "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": 1779979276614
}</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-28T22:41:16.634701" elapsed="0.000423"/>
</kw>
<doc>验证24小时行情接口基本功能获取24小时行情数据</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T22:41:16.363831" elapsed="0.271472"/>
</test>
<doc>24小时行情</doc>
<status status="PASS" start="2026-05-28T22:41:16.350907" elapsed="0.284774"/>
</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-28T22:41:16.645052" 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-28T22:41:16.644787" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.645703" 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-28T22:41:16.645511" elapsed="0.000262"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:16.645229" elapsed="0.000596"/>
</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-28T22:41:16.646023" elapsed="0.000233"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:16.645864" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:16.645192" elapsed="0.001283"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.647833" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:16.647577" elapsed="0.000328"/>
</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-28T22:41:16.648249" 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-28T22:41:16.648384" 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-28T22:41:16.648498" 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-28T22:41:16.648684" elapsed="0.000032"/>
</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-28T22:41:16.648836" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:16.648015" elapsed="0.000873"/>
</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-28T22:41:16.649092" 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-28T22:41:16.649198" 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-28T22:41:16.649295" 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-28T22:41:16.649385" 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-28T22:41:16.649491" 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-28T22:41:16.649581" 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-28T22:41:16.649669" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:16.649757" 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-28T22:41:16.649850" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:16.648919" elapsed="0.000982"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.650302" 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-28T22:41:16.650010" elapsed="0.000345"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.650653" 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-28T22:41:16.650453" elapsed="0.000238"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.650996" 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-28T22:41:16.650791" elapsed="0.000245"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.651353" 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-28T22:41:16.651151" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.651653" 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-28T22:41:16.651475" elapsed="0.000213"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.651973" 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-28T22:41:16.651777" elapsed="0.000229"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.652296" 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-28T22:41:16.652098" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.652586" 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-28T22:41:16.652411" elapsed="0.000203"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.652884" 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-28T22:41:16.652703" elapsed="0.000210"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:16.649928" elapsed="0.003015"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:16.647986" elapsed="0.004986"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.653258" 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-28T22:41:16.653077" elapsed="0.000227"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:16.653868" 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-28T22:41:16.653474" elapsed="0.000715"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:16.647038" elapsed="0.007317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.654768" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:16.654575" elapsed="0.000242"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:16.644116" elapsed="0.010770"/>
</kw>
<test id="s1-s4-s2-s2-t1" name="获取市场深度数据" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.660900" 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-28T22:41:16.660255" elapsed="0.000755"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.663385" 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-28T22:41:16.662626" elapsed="0.000796"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:16.664384" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:16.663579" elapsed="0.000878"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:16.663554" elapsed="0.000941"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:16.664534" elapsed="0.000043"/>
</return>
<msg time="2026-05-28T22:41:16.664778" 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-28T22:41:16.661593" elapsed="0.003215"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:16.981943" 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-28T22:41:16.982262" 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 14:41: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-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '8e0b559af90c7e69e19885199111e091', 'X-Transparent': '00-8e0b559af90c7e69e19885199111e091-8751431696e9981c-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': 'a02e04f0ca6ddd63-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"timestamp":1779979271513,"lastUpdateId":1772263404918,"bids":[["72976.00","3.825800"],["72975.99","3.039440"],["72975.98","0.812510"],["72975.94","0.612940"],["72975.93","0.489810"],["72975.91","2.184530"],["72975.90","18.560390"],["72975.89","1.843140"],["72975.86","25.082800"],["72975.85","20.978700"],["72975.84","1.902580"],["72975.80","0.760360"],["72975.73","0.964620"],["72975.69","2.496390"],["72975.67","0.736950"],["72975.59","6.323660"],["72975.56","0.583010"],["72975.53","1.575590"],["72975.46","4.706570"],["72975.38","4.352740"],["72975.32","0.787900"],["72975.31","0.493040"],["72975.24","0.321560"],["72975.18","0.545890"],["72975.10","0.610460"],["72975.09","4.509810"],["72975.02","0.370720"],["72974.98","0.323580"],["72974.86","0.307240"],["72974.61","4.768470"],["72974.55","3.934890"],["72974.42","2.933310"],["72974.38","0.809400"],["72974.30","6.742820"],["72974.26","1.850520"],["72974.11","2.604820"],["72973.88","0.440120"],["72973.87","0.724230"],["72973.77","3.173190"],["72973.75","3.034850"],["72973.63","0.433110"],["72973.61","0.528010"],["72973.59","0.454120"],["72973.36","4.561640"],["72973.31","0.213150"],["72973.27","0.627650"],["72973.11","4.026470"],["72972.93","0.802890"],["72972.12","0.440120"],["72972.10","0.543990"],["72971.74","5.346180"],["72971.73","0.157920"],["72971.46","0.906700"],["72971.45","0.668910"],["72971.43","3.099550"],["72971.37","0.500490"],["72971.33","0.963460"],["72971.31","2.546100"],["72971.29","0.656520"],["72971.25","0.553980"],["72971.24","0.181110"],["72971.12","0.745690"],["72971.02","1.467320"],["72970.84","0.831730"],["72970.82","0.829580"],["72970.74","0.241870"],["72970.71","0.225520"],["72970.32","0.434890"],["72969.96","0.662430"],["72969.92","1.062640"],["72969.83","6.327970"],["72969.75","0.967180"],["72969.73","5.518630"],["72969.47","0.318870"],["72969.39","0.666640"],["72969.35","0.568430"],["72969.17","2.885820"],["72968.92","6.053320"],["72968.83","7.240710"],["72968.73","2.641090"],["72968.15","0.602980"],["72967.84","4.921520"],["72967.71","3.152120"],["72967.52","0.548650"],["72967.50","0.764760"],["72967.42","6.529850"],["72967.40","3.291090"],["72966.99","0.362420"],["72966.95","0.288210"],["72966.92","0.520890"],["72966.13","4.935080"],["72965.88","2.717100"],["72965.76","0.397420"],["72965.59","0.671610"],["72965.47","0.626920"],["72965.30","0.442340"],["72965.21","0.638390"],["72965.06","2.617090"],["72964.89","2.439970"],["72964.54","0.872620"],["72964.53","3.017810"],["72964.49","0.590740"],["72964.25","0.328570"],["72964.06","1.920220"],["72963.97","0.318720"],["72963.90","3.810730"],["72963.83","0.637560"],["72963.61","1.892320"],["72963.55","0.252700"],["72963.49","4.268110"],["72963.29","0.237000"],["72962.24","0.327340"],["72961.79","0.405230"],["72961.62","0.498890"],["72961.36","0.510240"],["72960.60","5.951230"],["72960.56","0.441390"],["72960.43","3.960710"],["72960.41","0.573150"],["72960.32","0.478050"],["72960.23","0.273710"],["72959.89","5.643230"],["72959.67","1.611640"],["72959.24","6.661740"],["72958.88","0.889720"],["72958.81","2.737790"],["72958.67","6.229900"],["72957.62","3.213710"],["72957.25","4.576750"],["72957.03","2.446430"],["72957.02","3.174550"],["72956.95","0.238060"],["72956.80","2.524870"],["72956.24","0.969110"],["72955.48","2.205290"],["72955.43","0.490750"],["72954.86","3.043010"],["72954.73","5.235910"],["72954.65","3.445210"],["72954.61","0.742400"],["72954.53","1.107820"],["72954.36","0.545820"],["72954.00","1.479050"],["72953.58","3.905960"],["72953.49","3.024430"],["72953.23","4.071990"],["72953.22","0.340350"],["72952.83","0.715720"],["72952.65","3.855160"],["72952.49","4.483330"],["72952.40","3.661130"],["72952.33","1.497100"],["72952.24","0.339270"],["72951.94","0.732050"],["72951.82","0.296880"],["72951.54","0.494970"],["72951.35","4.068330"],["72951.15","2.848540"],["72950.72","1.840970"],["72950.66","3.424520"],["72950.34","0.536120"],["72950.24","0.436750"],["72950.13","0.542860"],["72949.91","0.526040"],["72949.84","0.184030"],["72949.73","2.461630"],["72949.63","0.537710"],["72949.02","0.366020"],["72948.80","0.363710"],["72948.50","5.047420"],["72946.94","3.749940"],["72946.82","0.819230"],["72946.63","0.909850"],["72946.54","1.322900"],["72946.30","4.144140"],["72946.21","3.570860"],["72945.66","1.198480"],["72944.95","5.154720"],["72944.01","5.073170"],["72943.69","0.799850"],["72943.25","0.540900"],["72943.15","0.738390"],["72941.96","6.556450"],["72941.84","0.685200"],["72941.82","0.597650"],["72941.09","3.337080"],["72939.52","3.584430"],["72939.31","0.541410"],["72938.68","4.966630"],["72938.34","2.626660"],["72938.17","0.571070"],["72937.41","1.814080"],["72936.86","3.404980"],["72936.21","0.431330"],["72935.40","0.304650"],["71874.70","3.919560"],["71874.66","1.574140"],["70940.15","0.402920"],["70940.04","5.567660"],["0.01","1111.000001"]],"asks":[["72976.01","4.103720"],["72976.02","3.615520"],["72976.03","2.811950"],["72976.07","0.649430"],["72976.08","4.600870"],["72976.09","4.501720"],["72976.12","24.872800"],["72976.15","24.179700"],["72976.16","17.377060"],["72976.18","0.773470"],["72976.19","2.415660"],["72976.29","4.092020"],["72976.30","1.571350"],["72976.34","0.504530"],["72976.35","4.779970"],["72976.45","0.407720"],["72976.48","5.832010"],["72976.53","3.473840"],["72976.56","3.556570"],["72976.67","7.262210"],["72976.78","1.281590"],["72976.79","3.956990"],["72976.95","0.346900"],["72977.00","1.114210"],["72977.05","0.782790"],["72977.14","0.782790"],["72977.15","0.302980"],["72977.24","0.427470"],["72977.44","1.645370"],["72977.52","0.329310"],["72977.61","2.273640"],["72977.72","6.682860"],["72977.83","2.665120"],["72978.00","2.073790"],["72978.04","0.508290"],["72978.23","0.209770"],["72978.27","2.313270"],["72978.33","5.640600"],["72978.34","0.598230"],["72978.38","3.490580"],["72978.41","0.212710"],["72978.55","1.712130"],["72978.59","0.650700"],["72978.97","0.213940"],["72979.23","0.553960"],["72979.32","1.402360"],["72979.44","0.511810"],["72979.45","0.346410"],["72979.52","0.727670"],["72979.61","7.871820"],["72979.80","2.205420"],["72979.95","0.328890"],["72979.97","0.730360"],["72980.19","1.143860"],["72980.20","1.949640"],["72980.30","0.620930"],["72980.42","0.492050"],["72980.51","2.573990"],["72980.59","3.791260"],["72980.63","7.089050"],["72980.65","1.594750"],["72980.79","0.630400"],["72982.89","3.853720"],["72982.90","2.535120"],["72982.91","0.766490"],["72982.93","3.171340"],["72983.02","0.179970"],["72983.05","2.882340"],["72983.14","1.814720"],["72983.16","3.176330"],["72983.20","7.231850"],["72983.26","2.217920"],["72983.37","0.700160"],["72983.46","4.169700"],["72983.49","0.793310"],["72983.64","0.683010"],["72983.68","0.561130"],["72983.71","0.754040"],["72983.74","0.517800"],["72983.78","0.893700"],["72983.87","0.357520"],["72983.90","0.791610"],["72984.04","0.468220"],["72984.33","0.422230"],["72984.57","0.711020"],["72984.74","0.577080"],["72984.87","1.673200"],["72985.01","0.449610"],["72985.03","0.673140"],["72985.04","0.968990"],["72986.16","2.012440"],["72987.36","3.133280"],["72987.38","2.669210"],["72987.41","0.554540"],["72987.42","0.781110"],["72987.44","4.411340"],["72987.49","0.694860"],["72987.51","8.399260"],["72987.62","0.670010"],["72987.65","0.803070"],["72987.81","0.486650"],["72987.83","2.450320"],["72987.98","0.769240"],["72988.09","4.755480"],["72988.20","2.521370"],["72988.46","0.617120"],["72988.69","2.266180"],["72988.99","0.982090"],["72989.12","6.792430"],["72989.18","4.882860"],["72989.45","1.015570"],["72990.00","0.000110"],["72990.23","0.768910"],["72990.24","0.406470"],["72990.27","0.444410"],["72990.44","2.223580"],["72991.16","0.865680"],["72991.79","0.615290"],["72991.91","2.976200"],["72992.29","0.738900"],["72992.74","3.139630"],["72992.81","3.656800"],["72992.86","0.434620"],["72993.04","2.876300"],["72993.11","3.169430"],["72993.24","4.494380"],["72993.35","1.584870"],["72994.40","4.039630"],["72994.44","1.006220"],["72994.72","0.383530"],["72994.93","4.095540"],["72995.03","0.499400"],["72996.41","0.799570"],["72996.54","0.677930"],["72996.56","4.543590"],["72996.57","0.623930"],["72996.86","1.215400"],["72997.53","0.755280"],["72997.72","3.574370"],["72999.62","3.196470"],["73000.02","4.189040"],["73000.04","3.140720"],["73000.13","0.640480"],["73000.16","4.623630"],["73000.21","3.909150"],["73000.22","7.916900"],["73000.36","0.797400"],["73000.47","1.855070"],["73000.49","4.442640"],["73000.88","2.208560"],["73000.89","0.556280"],["73000.97","1.440710"],["73000.99","0.830630"],["73001.00","0.636820"],["73001.59","4.080180"],["73001.70","0.669190"],["73001.98","0.380260"],["73002.46","0.551020"],["73002.53","3.001230"],["73003.25","0.434690"],["73003.34","0.624970"],["73003.59","0.451320"],["73004.23","1.154730"],["73004.27","0.903800"],["73005.08","1.199180"],["73005.20","0.639850"],["73005.82","0.650930"],["73006.24","1.528040"],["73006.36","3.445530"],["73006.48","0.418330"],["73006.66","0.452100"],["73006.95","0.852260"],["73007.09","0.468520"],["73007.29","1.945640"],["73007.41","3.267340"],["73007.68","0.562780"],["73008.33","0.225900"],["73009.39","5.694490"],["73009.51","0.399320"],["73010.05","0.873580"],["73010.14","0.428510"],["73010.26","0.729680"],["73010.33","2.121290"],["73011.05","1.121150"],["73011.11","0.511860"],["73012.27","5.794480"],["73013.57","0.567120"],["73013.90","0.739810"],["73014.05","0.687320"],["73014.17","0.905920"],["73014.64","6.473220"],["73014.75","0.620500"],["73015.00","0.835300"],["73016.38","0.764950"],["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",... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-05-28T22:41:16.982473" 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-28T22:41:16.982640" 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-28T22:41:16.664928" elapsed="0.317737"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.984043" 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-28T22:41:16.982957" elapsed="0.001182"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.985817" level="INFO">${resp_json} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'timestamp': 1779979271513, 'lastUpdateId': 1772263404918, 'bids': [['72976.00', '3.825800'], ['72975.99', '3.039440'], ['72975.98', '0.812510'], ...</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-28T22:41:16.984341" elapsed="0.001507"/>
</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-28T22:41:16.986031" elapsed="0.000171"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.988285" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "timestamp": 1779979271513,
    "lastUpdateId": 1772263404918,
    "bids": [
      [
        "72976.00",
        "3.825800"
      ],...</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-28T22:41:16.986310" elapsed="0.002050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.989013" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "timestamp": 1779979271513,
    "lastUpdateId": 1772263404918,
    "bids": [
      [
        "72976.00",
        "3.825800"
      ],
      [
        "72975.99",
        "3.039440"
      ],
      [
        "72975.98",
        "0.812510"
      ],
      [
        "72975.94",
        "0.612940"
      ],
      [
        "72975.93",
        "0.489810"
      ],
      [
        "72975.91",
        "2.184530"
      ],
      [
        "72975.90",
        "18.560390"
      ],
      [
        "72975.89",
        "1.843140"
      ],
      [
        "72975.86",
        "25.082800"
      ],
      [
        "72975.85",
        "20.978700"
      ],
      [
        "72975.84",
        "1.902580"
      ],
      [
        "72975.80",
        "0.760360"
      ],
      [
        "72975.73",
        "0.964620"
      ],
      [
        "72975.69",
        "2.496390"
      ],
      [
        "72975.67",
        "0.736950"
      ],
      [
        "72975.59",
        "6.323660"
      ],
      [
        "72975.56",
        "0.583010"
      ],
      [
        "72975.53",
        "1.575590"
      ],
      [
        "72975.46",
        "4.706570"
      ],
      [
        "72975.38",
        "4.352740"
      ],
      [
        "72975.32",
        "0.787900"
      ],
      [
        "72975.31",
        "0.493040"
      ],
      [
        "72975.24",
        "0.321560"
      ],
      [
        "72975.18",
        "0.545890"
      ],
      [
        "72975.10",
        "0.610460"
      ],
      [
        "72975.09",
        "4.509810"
      ],
      [
        "72975.02",
        "0.370720"
      ],
      [
        "72974.98",
        "0.323580"
      ],
      [
        "72974.86",
        "0.307240"
      ],
      [
        "72974.61",
        "4.768470"
      ],
      [
        "72974.55",
        "3.934890"
      ],
      [
        "72974.42",
        "2.933310"
      ],
      [
        "72974.38",
        "0.809400"
      ],
      [
        "72974.30",
        "6.742820"
      ],
      [
        "72974.26",
        "1.850520"
      ],
      [
        "72974.11",
        "2.604820"
      ],
      [
        "72973.88",
        "0.440120"
      ],
      [
        "72973.87",
        "0.724230"
      ],
      [
        "72973.77",
        "3.173190"
      ],
      [
        "72973.75",
        "3.034850"
      ],
      [
        "72973.63",
        "0.433110"
      ],
      [
        "72973.61",
        "0.528010"
      ],
      [
        "72973.59",
        "0.454120"
      ],
      [
        "72973.36",
        "4.561640"
      ],
      [
        "72973.31",
        "0.213150"
      ],
      [
        "72973.27",
        "0.627650"
      ],
      [
        "72973.11",
        "4.026470"
      ],
      [
        "72972.93",
        "0.802890"
      ],
      [
        "72972.12",
        "0.440120"
      ],
      [
        "72972.10",
        "0.543990"
      ],
      [
        "72971.74",
        "5.346180"
      ],
      [
        "72971.73",
        "0.157920"
      ],
      [
        "72971.46",
        "0.906700"
      ],
      [
        "72971.45",
        "0.668910"
      ],
      [
        "72971.43",
        "3.099550"
      ],
      [
        "72971.37",
        "0.500490"
      ],
      [
        "72971.33",
        "0.963460"
      ],
      [
        "72971.31",
        "2.546100"
      ],
      [
        "72971.29",
        "0.656520"
      ],
      [
        "72971.25",
        "0.553980"
      ],
      [
        "72971.24",
        "0.181110"
      ],
      [
        "72971.12",
        "0.745690"
      ],
      [
        "72971.02",
        "1.467320"
      ],
      [
        "72970.84",
        "0.831730"
      ],
      [
        "72970.82",
        "0.829580"
      ],
      [
        "72970.74",
        "0.241870"
      ],
      [
        "72970.71",
        "0.225520"
      ],
      [
        "72970.32",
        "0.434890"
      ],
      [
        "72969.96",
        "0.662430"
      ],
      [
        "72969.92",
        "1.062640"
      ],
      [
        "72969.83",
        "6.327970"
      ],
      [
        "72969.75",
        "0.967180"
      ],
      [
        "72969.73",
        "5.518630"
      ],
      [
        "72969.47",
        "0.318870"
      ],
      [
        "72969.39",
        "0.666640"
      ],
      [
        "72969.35",
        "0.568430"
      ],
      [
        "72969.17",
        "2.885820"
      ],
      [
        "72968.92",
        "6.053320"
      ],
      [
        "72968.83",
        "7.240710"
      ],
      [
        "72968.73",
        "2.641090"
      ],
      [
        "72968.15",
        "0.602980"
      ],
      [
        "72967.84",
        "4.921520"
      ],
      [
        "72967.71",
        "3.152120"
      ],
      [
        "72967.52",
        "0.548650"
      ],
      [
        "72967.50",
        "0.764760"
      ],
      [
        "72967.42",
        "6.529850"
      ],
      [
        "72967.40",
        "3.291090"
      ],
      [
        "72966.99",
        "0.362420"
      ],
      [
        "72966.95",
        "0.288210"
      ],
      [
        "72966.92",
        "0.520890"
      ],
      [
        "72966.13",
        "4.935080"
      ],
      [
        "72965.88",
        "2.717100"
      ],
      [
        "72965.76",
        "0.397420"
      ],
      [
        "72965.59",
        "0.671610"
      ],
      [
        "72965.47",
        "0.626920"
      ],
      [
        "72965.30",
        "0.442340"
      ],
      [
        "72965.21",
        "0.638390"
      ],
      [
        "72965.06",
        "2.617090"
      ],
      [
        "72964.89",
        "2.439970"
      ],
      [
        "72964.54",
        "0.872620"
      ],
      [
        "72964.53",
        "3.017810"
      ],
      [
        "72964.49",
        "0.590740"
      ],
      [
        "72964.25",
        "0.328570"
      ],
      [
        "72964.06",
        "1.920220"
      ],
      [
        "72963.97",
        "0.318720"
      ],
      [
        "72963.90",
        "3.810730"
      ],
      [
        "72963.83",
        "0.637560"
      ],
      [
        "72963.61",
        "1.892320"
      ],
      [
        "72963.55",
        "0.252700"
      ],
      [
        "72963.49",
        "4.268110"
      ],
      [
        "72963.29",
        "0.237000"
      ],
      [
        "72962.24",
        "0.327340"
      ],
      [
        "72961.79",
        "0.405230"
      ],
      [
        "72961.62",
        "0.498890"
      ],
      [
        "72961.36",
        "0.510240"
      ],
      [
        "72960.60",
        "5.951230"
      ],
      [
        "72960.56",
        "0.441390"
      ],
      [
        "72960.43",
        "3.960710"
      ],
      [
        "72960.41",
        "0.573150"
      ],
      [
        "72960.32",
        "0.478050"
      ],
      [
        "72960.23",
        "0.273710"
      ],
      [
        "72959.89",
        "5.643230"
      ],
      [
        "72959.67",
        "1.611640"
      ],
      [
        "72959.24",
        "6.661740"
      ],
      [
        "72958.88",
        "0.889720"
      ],
      [
        "72958.81",
        "2.737790"
      ],
      [
        "72958.67",
        "6.229900"
      ],
      [
        "72957.62",
        "3.213710"
      ],
      [
        "72957.25",
        "4.576750"
      ],
      [
        "72957.03",
        "2.446430"
      ],
      [
        "72957.02",
        "3.174550"
      ],
      [
        "72956.95",
        "0.238060"
      ],
      [
        "72956.80",
        "2.524870"
      ],
      [
        "72956.24",
        "0.969110"
      ],
      [
        "72955.48",
        "2.205290"
      ],
      [
        "72955.43",
        "0.490750"
      ],
      [
        "72954.86",
        "3.043010"
      ],
      [
        "72954.73",
        "5.235910"
      ],
      [
        "72954.65",
        "3.445210"
      ],
      [
        "72954.61",
        "0.742400"
      ],
      [
        "72954.53",
        "1.107820"
      ],
      [
        "72954.36",
        "0.545820"
      ],
      [
        "72954.00",
        "1.479050"
      ],
      [
        "72953.58",
        "3.905960"
      ],
      [
        "72953.49",
        "3.024430"
      ],
      [
        "72953.23",
        "4.071990"
      ],
      [
        "72953.22",
        "0.340350"
      ],
      [
        "72952.83",
        "0.715720"
      ],
      [
        "72952.65",
        "3.855160"
      ],
      [
        "72952.49",
        "4.483330"
      ],
      [
        "72952.40",
        "3.661130"
      ],
      [
        "72952.33",
        "1.497100"
      ],
      [
        "72952.24",
        "0.339270"
      ],
      [
        "72951.94",
        "0.732050"
      ],
      [
        "72951.82",
        "0.296880"
      ],
      [
        "72951.54",
        "0.494970"
      ],
      [
        "72951.35",
        "4.068330"
      ],
      [
        "72951.15",
        "2.848540"
      ],
      [
        "72950.72",
        "1.840970"
      ],
      [
        "72950.66",
        "3.424520"
      ],
      [
        "72950.34",
        "0.536120"
      ],
      [
        "72950.24",
        "0.436750"
      ],
      [
        "72950.13",
        "0.542860"
      ],
      [
        "72949.91",
        "0.526040"
      ],
      [
        "72949.84",
        "0.184030"
      ],
      [
        "72949.73",
        "2.461630"
      ],
      [
        "72949.63",
        "0.537710"
      ],
      [
        "72949.02",
        "0.366020"
      ],
      [
        "72948.80",
        "0.363710"
      ],
      [
        "72948.50",
        "5.047420"
      ],
      [
        "72946.94",
        "3.749940"
      ],
      [
        "72946.82",
        "0.819230"
      ],
      [
        "72946.63",
        "0.909850"
      ],
      [
        "72946.54",
        "1.322900"
      ],
      [
        "72946.30",
        "4.144140"
      ],
      [
        "72946.21",
        "3.570860"
      ],
      [
        "72945.66",
        "1.198480"
      ],
      [
        "72944.95",
        "5.154720"
      ],
      [
        "72944.01",
        "5.073170"
      ],
      [
        "72943.69",
        "0.799850"
      ],
      [
        "72943.25",
        "0.540900"
      ],
      [
        "72943.15",
        "0.738390"
      ],
      [
        "72941.96",
        "6.556450"
      ],
      [
        "72941.84",
        "0.685200"
      ],
      [
        "72941.82",
        "0.597650"
      ],
      [
        "72941.09",
        "3.337080"
      ],
      [
        "72939.52",
        "3.584430"
      ],
      [
        "72939.31",
        "0.541410"
      ],
      [
        "72938.68",
        "4.966630"
      ],
      [
        "72938.34",
        "2.626660"
      ],
      [
        "72938.17",
        "0.571070"
      ],
      [
        "72937.41",
        "1.814080"
      ],
      [
        "72936.86",
        "3.404980"
      ],
      [
        "72936.21",
        "0.431330"
      ],
      [
        "72935.40",
        "0.304650"
      ],
      [
        "71874.70",
        "3.919560"
      ],
      [
        "71874.66",
        "1.574140"
      ],
      [
        "70940.15",
        "0.402920"
      ],
      [
        "70940.04",
        "5.567660"
      ],
      [
        "0.01",
        "1111.000001"
      ]
    ],
    "asks": [
      [
        "72976.01",
        "4.103720"
      ],
      [
        "72976.02",
        "3.615520"
      ],
      [
        "72976.03",
        "2.811950"
      ],
      [
        "72976.07",
        "0.649430"
      ],
      [
        "72976.08",
        "4.600870"
      ],
      [
        "72976.09",
        "4.501720"
      ],
      [
        "72976.12",
        "24.872800"
      ],
      [
        "72976.15",
        "24.179700"
      ],
      [
        "72976.16",
        "17.377060"
      ],
      [
        "72976.18",
        "0.773470"
      ],
      [
        "72976.19",
        "2.415660"
      ],
      [
        "72976.29",
        "4.092020"
      ],
      [
        "72976.30",
        "1.571350"
      ],
      [
        "72976.34",
        "0.504530"
      ],
      [
        "72976.35",
        "4.779970"
      ],
      [
        "72976.45",
        "0.407720"
      ],
      [
        "72976.48",
        "5.832010"
      ],
      [
        "72976.53",
        "3.473840"
      ],
      [
        "72976.56",
        "3.556570"
      ],
      [
        "72976.67",
        "7.262210"
      ],
      [
        "72976.78",
        "1.281590"
      ],
      [
        "72976.79",
        "3.956990"
      ],
      [
        "72976.95",
        "0.346900"
      ],
      [
        "72977.00",
        "1.114210"
      ],
      [
        "72977.05",
        "0.782790"
      ],
      [
        "72977.14",
        "0.782790"
      ],
      [
        "72977.15",
        "0.302980"
      ],
      [
        "72977.24",
        "0.427470"
      ],
      [
        "72977.44",
        "1.645370"
      ],
      [
        "72977.52",
        "0.329310"
      ],
      [
        "72977.61",
        "2.273640"
      ],
      [
        "72977.72",
        "6.682860"
      ],
      [
        "72977.83",
        "2.665120"
      ],
      [
        "72978.00",
        "2.073790"
      ],
      [
        "72978.04",
        "0.508290"
      ],
      [
        "72978.23",
        "0.209770"
      ],
      [
        "72978.27",
        "2.313270"
      ],
      [
        "72978.33",
        "5.640600"
      ],
      [
        "72978.34",
        "0.598230"
      ],
      [
        "72978.38",
        "3.490580"
      ],
      [
        "72978.41",
        "0.212710"
      ],
      [
        "72978.55",
        "1.712130"
      ],
      [
        "72978.59",
        "0.650700"
      ],
      [
        "72978.97",
        "0.213940"
      ],
      [
        "72979.23",
        "0.553960"
      ],
      [
        "72979.32",
        "1.402360"
      ],
      [
        "72979.44",
        "0.511810"
      ],
      [
        "72979.45",
        "0.346410"
      ],
      [
        "72979.52",
        "0.727670"
      ],
      [
        "72979.61",
        "7.871820"
      ],
      [
        "72979.80",
        "2.205420"
      ],
      [
        "72979.95",
        "0.328890"
      ],
      [
        "72979.97",
        "0.730360"
      ],
      [
        "72980.19",
        "1.143860"
      ],
      [
        "72980.20",
        "1.949640"
      ],
      [
        "72980.30",
        "0.620930"
      ],
      [
        "72980.42",
        "0.492050"
      ],
      [
        "72980.51",
        "2.573990"
      ],
      [
        "72980.59",
        "3.791260"
      ],
      [
        "72980.63",
        "7.089050"
      ],
      [
        "72980.65",
        "1.594750"
      ],
      [
        "72980.79",
        "0.630400"
      ],
      [
        "72982.89",
        "3.853720"
      ],
      [
        "72982.90",
        "2.535120"
      ],
      [
        "72982.91",
        "0.766490"
      ],
      [
        "72982.93",
        "3.171340"
      ],
      [
        "72983.02",
        "0.179970"
      ],
      [
        "72983.05",
        "2.882340"
      ],
      [
        "72983.14",
        "1.814720"
      ],
      [
        "72983.16",
        "3.176330"
      ],
      [
        "72983.20",
        "7.231850"
      ],
      [
        "72983.26",
        "2.217920"
      ],
      [
        "72983.37",
        "0.700160"
      ],
      [
        "72983.46",
        "4.169700"
      ],
      [
        "72983.49",
        "0.793310"
      ],
      [
        "72983.64",
        "0.683010"
      ],
      [
        "72983.68",
        "0.561130"
      ],
      [
        "72983.71",
        "0.754040"
      ],
      [
        "72983.74",
        "0.517800"
      ],
      [
        "72983.78",
        "0.893700"
      ],
      [
        "72983.87",
        "0.357520"
      ],
      [
        "72983.90",
        "0.791610"
      ],
      [
        "72984.04",
        "0.468220"
      ],
      [
        "72984.33",
        "0.422230"
      ],
      [
        "72984.57",
        "0.711020"
      ],
      [
        "72984.74",
        "0.577080"
      ],
      [
        "72984.87",
        "1.673200"
      ],
      [
        "72985.01",
        "0.449610"
      ],
      [
        "72985.03",
        "0.673140"
      ],
      [
        "72985.04",
        "0.968990"
      ],
      [
        "72986.16",
        "2.012440"
      ],
      [
        "72987.36",
        "3.133280"
      ],
      [
        "72987.38",
        "2.669210"
      ],
      [
        "72987.41",
        "0.554540"
      ],
      [
        "72987.42",
        "0.781110"
      ],
      [
        "72987.44",
        "4.411340"
      ],
      [
        "72987.49",
        "0.694860"
      ],
      [
        "72987.51",
        "8.399260"
      ],
      [
        "72987.62",
        "0.670010"
      ],
      [
        "72987.65",
        "0.803070"
      ],
      [
        "72987.81",
        "0.486650"
      ],
      [
        "72987.83",
        "2.450320"
      ],
      [
        "72987.98",
        "0.769240"
      ],
      [
        "72988.09",
        "4.755480"
      ],
      [
        "72988.20",
        "2.521370"
      ],
      [
        "72988.46",
        "0.617120"
      ],
      [
        "72988.69",
        "2.266180"
      ],
      [
        "72988.99",
        "0.982090"
      ],
      [
        "72989.12",
        "6.792430"
      ],
      [
        "72989.18",
        "4.882860"
      ],
      [
        "72989.45",
        "1.015570"
      ],
      [
        "72990.00",
        "0.000110"
      ],
      [
        "72990.23",
        "0.768910"
      ],
      [
        "72990.24",
        "0.406470"
      ],
      [
        "72990.27",
        "0.444410"
      ],
      [
        "72990.44",
        "2.223580"
      ],
      [
        "72991.16",
        "0.865680"
      ],
      [
        "72991.79",
        "0.615290"
      ],
      [
        "72991.91",
        "2.976200"
      ],
      [
        "72992.29",
        "0.738900"
      ],
      [
        "72992.74",
        "3.139630"
      ],
      [
        "72992.81",
        "3.656800"
      ],
      [
        "72992.86",
        "0.434620"
      ],
      [
        "72993.04",
        "2.876300"
      ],
      [
        "72993.11",
        "3.169430"
      ],
      [
        "72993.24",
        "4.494380"
      ],
      [
        "72993.35",
        "1.584870"
      ],
      [
        "72994.40",
        "4.039630"
      ],
      [
        "72994.44",
        "1.006220"
      ],
      [
        "72994.72",
        "0.383530"
      ],
      [
        "72994.93",
        "4.095540"
      ],
      [
        "72995.03",
        "0.499400"
      ],
      [
        "72996.41",
        "0.799570"
      ],
      [
        "72996.54",
        "0.677930"
      ],
      [
        "72996.56",
        "4.543590"
      ],
      [
        "72996.57",
        "0.623930"
      ],
      [
        "72996.86",
        "1.215400"
      ],
      [
        "72997.53",
        "0.755280"
      ],
      [
        "72997.72",
        "3.574370"
      ],
      [
        "72999.62",
        "3.196470"
      ],
      [
        "73000.02",
        "4.189040"
      ],
      [
        "73000.04",
        "3.140720"
      ],
      [
        "73000.13",
        "0.640480"
      ],
      [
        "73000.16",
        "4.623630"
      ],
      [
        "73000.21",
        "3.909150"
      ],
      [
        "73000.22",
        "7.916900"
      ],
      [
        "73000.36",
        "0.797400"
      ],
      [
        "73000.47",
        "1.855070"
      ],
      [
        "73000.49",
        "4.442640"
      ],
      [
        "73000.88",
        "2.208560"
      ],
      [
        "73000.89",
        "0.556280"
      ],
      [
        "73000.97",
        "1.440710"
      ],
      [
        "73000.99",
        "0.830630"
      ],
      [
        "73001.00",
        "0.636820"
      ],
      [
        "73001.59",
        "4.080180"
      ],
      [
        "73001.70",
        "0.669190"
      ],
      [
        "73001.98",
        "0.380260"
      ],
      [
        "73002.46",
        "0.551020"
      ],
      [
        "73002.53",
        "3.001230"
      ],
      [
        "73003.25",
        "0.434690"
      ],
      [
        "73003.34",
        "0.624970"
      ],
      [
        "73003.59",
        "0.451320"
      ],
      [
        "73004.23",
        "1.154730"
      ],
      [
        "73004.27",
        "0.903800"
      ],
      [
        "73005.08",
        "1.199180"
      ],
      [
        "73005.20",
        "0.639850"
      ],
      [
        "73005.82",
        "0.650930"
      ],
      [
        "73006.24",
        "1.528040"
      ],
      [
        "73006.36",
        "3.445530"
      ],
      [
        "73006.48",
        "0.418330"
      ],
      [
        "73006.66",
        "0.452100"
      ],
      [
        "73006.95",
        "0.852260"
      ],
      [
        "73007.09",
        "0.468520"
      ],
      [
        "73007.29",
        "1.945640"
      ],
      [
        "73007.41",
        "3.267340"
      ],
      [
        "73007.68",
        "0.562780"
      ],
      [
        "73008.33",
        "0.225900"
      ],
      [
        "73009.39",
        "5.694490"
      ],
      [
        "73009.51",
        "0.399320"
      ],
      [
        "73010.05",
        "0.873580"
      ],
      [
        "73010.14",
        "0.428510"
      ],
      [
        "73010.26",
        "0.729680"
      ],
      [
        "73010.33",
        "2.121290"
      ],
      [
        "73011.05",
        "1.121150"
      ],
      [
        "73011.11",
        "0.511860"
      ],
      [
        "73012.27",
        "5.794480"
      ],
      [
        "73013.57",
        "0.567120"
      ],
      [
        "73013.90",
        "0.739810"
      ],
      [
        "73014.05",
        "0.687320"
      ],
      [
        "73014.17",
        "0.905920"
      ],
      [
        "73014.64",
        "6.473220"
      ],
      [
        "73014.75",
        "0.620500"
      ],
      [
        "73015.00",
        "0.835300"
      ],
      [
        "73016.38",
        "0.764950"
      ],
      [
        "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": 1779979276966
}</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-28T22:41:16.988611" elapsed="0.000947"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:16.991226" level="INFO">${data} = {'timestamp': 1779979271513, 'lastUpdateId': 1772263404918, 'bids': [['72976.00', '3.825800'], ['72975.99', '3.039440'], ['72975.98', '0.812510'], ['72975.94', '0.612940'], ['72975.93', '0.489810'], [...</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-28T22:41:16.989816" elapsed="0.001505"/>
</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-28T22:41:16.991638" elapsed="0.000457"/>
</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-28T22:41:16.992264" elapsed="0.000183"/>
</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-28T22:41:16.993436" elapsed="0.000264"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T22:41:16.994136" 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-28T22:41:16.993870" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:16.994558" 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-28T22:41:16.994346" elapsed="0.000272"/>
</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-28T22:41:16.995203" elapsed="0.000271"/>
</kw>
<msg time="2026-05-28T22:41:16.995713" 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-28T22:41:16.994886" elapsed="0.000881"/>
</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-28T22:41:16.996580" elapsed="0.001269"/>
</kw>
<msg time="2026-05-28T22:41:16.998196" 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-28T22:41:16.996055" elapsed="0.002211"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:16.999347" 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-28T22:41:16.999029" elapsed="0.000419">Dictionary does not contain key 'symbol'.</status>
</kw>
<msg time="2026-05-28T22:41:16.999617" 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-28T22:41:16.998600" elapsed="0.001053"/>
</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-28T22:41:16.999986" elapsed="0.000179"/>
</kw>
<msg time="2026-05-28T22:41:17.000269" 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-28T22:41:16.999815" elapsed="0.000483"/>
</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-28T22:41:17.000586" elapsed="0.000165"/>
</kw>
<msg time="2026-05-28T22:41:17.000853" 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-28T22:41:17.000433" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.001175" 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-28T22:41:17.001010" elapsed="0.000219"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.001490" 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-28T22:41:17.001347" elapsed="0.000192"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.001795" 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-28T22:41:17.001655" elapsed="0.000186"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.002097" 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-28T22:41:17.001953" elapsed="0.000193"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.002396" 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-28T22:41:17.002259" elapsed="0.000186"/>
</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-28T22:41:17.003800" elapsed="0.000344"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.004387" level="INFO">Length is 200.</msg>
<msg time="2026-05-28T22:41:17.004461" 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-28T22:41:17.004270" elapsed="0.000214"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.004827" level="INFO">买盘数据包含 200 个价位</msg>
<arg>买盘数据包含 ${bids_length} 个价位</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:17.004700" elapsed="0.000170"/>
</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-28T22:41:17.006552" elapsed="0.000319"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.007109" level="INFO">Length is 2.</msg>
<msg time="2026-05-28T22:41:17.007186" 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-28T22:41:17.006994" elapsed="0.000215"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.007456" 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-28T22:41:17.007310" elapsed="0.000189"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.008636" level="INFO">买盘价格: 72976.00, 数量: 3.825800</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-28T22:41:17.007796" elapsed="0.000885"/>
</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-28T22:41:17.007604" elapsed="0.001126"/>
</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-28T22:41:17.009034" elapsed="0.000258"/>
</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-28T22:41:17.008845" elapsed="0.000498"/>
</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-28T22:41:17.009639" elapsed="0.000235"/>
</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-28T22:41:17.009456" elapsed="0.000472"/>
</kw>
<arg>${bids[0]}</arg>
<arg>买盘</arg>
<doc>验证单个价格层级数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:17.005789" elapsed="0.004206"/>
</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-28T22:41:17.005243" elapsed="0.004803"/>
</kw>
<arg>${depth_dict['bids']}</arg>
<doc>验证买盘数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:17.002850" elapsed="0.007254"/>
</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-28T22:41:17.002571" elapsed="0.007578"/>
</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-28T22:41:17.011024" elapsed="0.000168"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.011379" level="INFO">Length is 212.</msg>
<msg time="2026-05-28T22:41:17.011441" level="INFO">${asks_length} = 212</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-28T22:41:17.011285" elapsed="0.000176"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.011649" level="INFO">卖盘数据包含 212 个价位</msg>
<arg>卖盘数据包含 ${asks_length} 个价位</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:17.011546" elapsed="0.000140"/>
</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-28T22:41:17.012636" elapsed="0.000210"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.013033" level="INFO">Length is 2.</msg>
<msg time="2026-05-28T22:41:17.013095" 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-28T22:41:17.012940" elapsed="0.000174"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.013325" 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-28T22:41:17.013200" elapsed="0.000161"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.014311" level="INFO">卖盘价格: 72976.01, 数量: 4.103720</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-28T22:41:17.013609" elapsed="0.000741"/>
</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-28T22:41:17.013450" elapsed="0.000939"/>
</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-28T22:41:17.014642" elapsed="0.000202"/>
</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-28T22:41:17.014484" elapsed="0.000404"/>
</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-28T22:41:17.015143" elapsed="0.000196"/>
</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-28T22:41:17.014984" elapsed="0.000400"/>
</kw>
<arg>${asks[0]}</arg>
<arg>卖盘</arg>
<doc>验证单个价格层级数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:17.011963" elapsed="0.003607"/>
</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-28T22:41:17.011772" elapsed="0.003837"/>
</kw>
<arg>${depth_dict['asks']}</arg>
<doc>验证卖盘数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:17.010482" elapsed="0.005174"/>
</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-28T22:41:17.010258" elapsed="0.005432"/>
</kw>
<arg>${data}</arg>
<doc>验证深度数据字典的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:16.993024" elapsed="0.022710"/>
</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-28T22:41:16.992552" elapsed="0.023217"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.016261" 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-28T22:41:17.015865" elapsed="0.000436"/>
</kw>
<doc>验证市场深度数据接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T22:41:16.654975" elapsed="0.361437"/>
</test>
<doc>市场深度数据接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:16.636564" elapsed="0.380113"/>
</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-28T22:41:17.020925" 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-28T22:41:17.020780" elapsed="0.000167"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.021258" 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-28T22:41:17.021158" elapsed="0.000134"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:17.021015" elapsed="0.000301"/>
</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-28T22:41:17.021406" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:17.021336" elapsed="0.000106"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:17.020994" elapsed="0.000462"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.021919" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:17.021829" elapsed="0.000123"/>
</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-28T22:41:17.022112" 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-28T22:41:17.022202" 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-28T22:41:17.022286" 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-28T22:41:17.022369" 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-28T22:41:17.022451" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:17.021999" elapsed="0.000488"/>
</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-28T22:41:17.022616" 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-28T22:41:17.022701" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:17.022783" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:17.022862" 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-28T22:41:17.022941" elapsed="0.000013"/>
</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-28T22:41:17.023021" elapsed="0.000012"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:17.023100" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:17.023179" 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-28T22:41:17.023256" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:17.022504" elapsed="0.000787"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.023550" 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-28T22:41:17.023375" elapsed="0.000206"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.023844" 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-28T22:41:17.023689" elapsed="0.000185"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.024103" 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-28T22:41:17.023954" elapsed="0.000178"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.024363" 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-28T22:41:17.024210" elapsed="0.000183"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.024622" 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-28T22:41:17.024471" elapsed="0.000180"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.024881" 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-28T22:41:17.024727" elapsed="0.000183"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.025151" 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-28T22:41:17.024989" elapsed="0.000191"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.025423" 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-28T22:41:17.025258" elapsed="0.000195"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.025689" 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-28T22:41:17.025530" elapsed="0.000188"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:17.023308" elapsed="0.002435"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:17.021987" elapsed="0.003771"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.025938" 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-28T22:41:17.025827" elapsed="0.000144"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:17.026257" 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-28T22:41:17.026048" elapsed="0.000352"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:17.021651" elapsed="0.004801"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.026593" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:17.026531" elapsed="0.000090"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:17.020611" elapsed="0.006087"/>
</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-28T22:41:17.028608" 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-28T22:41:17.028153" elapsed="0.000477"/>
</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-28T22:41:17.029074" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:17.028717" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:17.028704" elapsed="0.000428"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:17.029154" elapsed="0.000026"/>
</return>
<msg time="2026-05-28T22:41:17.029292" 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-28T22:41:17.027617" elapsed="0.001693"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:17.356460" 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-28T22:41:17.356638" 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 14:41: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-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '120d637ade20ba31d68ac6d1b9cf422b', 'X-Transparent': '00-120d637ade20ba31d68ac6d1b9cf422b-5e124bc006eb168c-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': 'a02e04f32d199a44-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":[],"ts":1779979277345} 
 </msg>
<msg time="2026-05-28T22:41:17.356789" 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-28T22:41:17.356959" 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-28T22:41:17.031546" elapsed="0.325445"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:17.357076" elapsed="0.000055"/>
</return>
<msg time="2026-05-28T22:41:17.357300" 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-28T22:41:17.029406" elapsed="0.327924"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.358504" 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-28T22:41:17.357910" elapsed="0.000666"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.359246" 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-28T22:41:17.358711" elapsed="0.000566"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.359557" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:17.359401" elapsed="0.000206"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:17.357550" elapsed="0.002121"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.360759" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [], 'ts': 1779979277345}</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-28T22:41:17.360182" elapsed="0.000608"/>
</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-28T22:41:17.360910" elapsed="0.000195"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.361361" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:17.361222" elapsed="0.000187"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T22:41:17.359844" elapsed="0.001627"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.362354" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [], 'ts': 1779979277345}</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-28T22:41:17.361915" elapsed="0.000467"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.362899" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [],
  "ts": 1779979277345
}</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-28T22:41:17.362484" elapsed="0.000444"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.363202" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [],
  "ts": 1779979277345
}</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-28T22:41:17.363037" elapsed="0.000261"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T22:41:17.361628" elapsed="0.001726"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:17.363945" 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-28T22:41:17.363459" elapsed="0.000512"/>
</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-28T22:41:17.364078" elapsed="0.000225"/>
</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-28T22:41:17.364934" elapsed="0.000190"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.365344" level="INFO">Length is 0.</msg>
<msg time="2026-05-28T22:41:17.365413" 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-28T22:41:17.365231" elapsed="0.000205"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.365650" level="INFO">盘口数据列表包含 0 个盘口</msg>
<arg>盘口数据列表包含 ${length} 个盘口</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:17.365535" elapsed="0.000153"/>
</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-28T22:41:17.365788" elapsed="0.000124"/>
</kw>
<arg>${data}</arg>
<doc>验证盘口数据列表的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:17.364678" elapsed="0.001291"/>
</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-28T22:41:17.364420" elapsed="0.001590"/>
</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-28T22:41:17.366143" elapsed="0.000151"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.367186" 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-28T22:41:17.366745" elapsed="0.000466"/>
</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-28T22:41:17.367452" elapsed="0.000449"/>
</kw>
<msg time="2026-05-28T22:41:17.367981" 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-28T22:41:17.367324" elapsed="0.000681"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.368251" 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-28T22:41:17.368117" elapsed="0.000158"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.368564" 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-28T22:41:17.368381" elapsed="0.000207"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.368848" 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-28T22:41:17.368694" elapsed="0.000177"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.369281" 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-28T22:41:17.368972" elapsed="0.000364"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.369998" 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-28T22:41:17.369493" elapsed="0.000532"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.370251" 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-28T22:41:17.370134" elapsed="0.000158"/>
</kw>
<arg>获取市场盘口数据</arg>
<arg>/v1/spot/market/public/plate</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T22:41:17.366451" elapsed="0.003891"/>
</kw>
<doc>验证市场盘口数据接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T22:41:17.026766" elapsed="0.343692"/>
</test>
<doc>市场盘口数据接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:17.017516" elapsed="0.353234"/>
</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-28T22:41:17.374704" 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-28T22:41:17.374561" elapsed="0.000165"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.375036" 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-28T22:41:17.374940" elapsed="0.000131"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:17.374791" elapsed="0.000306"/>
</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-28T22:41:17.375189" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:17.375116" elapsed="0.000108"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:17.374773" elapsed="0.000465"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.375711" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:17.375620" elapsed="0.000126"/>
</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-28T22:41:17.375909" 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-28T22:41:17.375997" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:17.376079" elapsed="0.000012"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:17.376161" 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-28T22:41:17.376243" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:17.375794" elapsed="0.000511"/>
</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-28T22:41:17.376438" 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-28T22:41:17.376526" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:17.376611" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:17.376692" 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-28T22:41:17.376772" elapsed="0.000013"/>
</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-28T22:41:17.376852" elapsed="0.000012"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:17.376931" 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-28T22:41:17.377011" 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-28T22:41:17.377093" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:17.376323" elapsed="0.000803"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.377473" 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-28T22:41:17.377209" elapsed="0.000296"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.377735" 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-28T22:41:17.377583" elapsed="0.000183"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.377996" 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-28T22:41:17.377844" elapsed="0.000183"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.378257" 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-28T22:41:17.378105" elapsed="0.000181"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.378519" 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-28T22:41:17.378364" elapsed="0.000213"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.378876" 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-28T22:41:17.378690" elapsed="0.000221"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.379172" 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-28T22:41:17.378997" elapsed="0.000206"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.379449" 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-28T22:41:17.379284" elapsed="0.000197"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.379722" 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-28T22:41:17.379560" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:17.377143" elapsed="0.002634"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:17.375781" elapsed="0.004013"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.379993" 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-28T22:41:17.379871" elapsed="0.000157"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:17.380318" 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-28T22:41:17.380107" elapsed="0.000338"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:17.375436" elapsed="0.005060"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.380643" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:17.380575" elapsed="0.000099"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:17.374390" elapsed="0.006322"/>
</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-28T22:41:17.382594" 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-28T22:41:17.382155" elapsed="0.000461"/>
</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-28T22:41:17.383068" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:17.382718" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:17.382705" elapsed="0.000419"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:17.383147" elapsed="0.000024"/>
</return>
<msg time="2026-05-28T22:41:17.383294" 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-28T22:41:17.381641" elapsed="0.001670"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:17.820528" 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-28T22:41:17.820923" 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 14:41: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-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '6c5af0f7408d291089feb355db417ead', 'X-Transparent': '00-6c5af0f7408d291089feb355db417ead-8096cb72f48dc568-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': 'a02e04f5bc514fc8-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"time":1779979277756,"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-28T22:41:17.821138" 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-28T22:41:17.821316" 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-28T22:41:17.383869" elapsed="0.437485"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:17.821601" elapsed="0.000107"/>
</return>
<msg time="2026-05-28T22:41:17.821953" 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-28T22:41:17.383418" elapsed="0.438563"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.823544" 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-28T22:41:17.822652" elapsed="0.001131"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.824781" 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-28T22:41:17.823990" elapsed="0.000838"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.825309" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:17.825034" elapsed="0.000342"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:17.822261" elapsed="0.003217"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.830117" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'time': 1779979277756, '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-28T22:41:17.826702" elapsed="0.003751"/>
</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-28T22:41:17.830776" elapsed="0.000567"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.831985" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:17.831598" elapsed="0.000466"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T22:41:17.825945" elapsed="0.006252"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.835071" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'time': 1779979277756, '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-28T22:41:17.833028" elapsed="0.002107"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.837811" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "time": 1779979277756,
    "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-28T22:41:17.835375" elapsed="0.002512"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.838514" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "time": 1779979277756,
    "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": 1779979277756
}</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-28T22:41:17.838122" elapsed="0.001040"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T22:41:17.832501" elapsed="0.006806"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:17.841389" level="INFO">${data} = {'time': 1779979277756, '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-28T22:41:17.839598" elapsed="0.001855"/>
</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-28T22:41:17.841778" elapsed="0.001719"/>
</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-28T22:41:17.843903" elapsed="0.000422"/>
</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-28T22:41:17.845414" elapsed="0.000259"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T22:41:17.846003" 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-28T22:41:17.845809" elapsed="0.000223"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.846294" level="INFO">Length is 3.</msg>
<msg time="2026-05-28T22:41:17.846360" 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-28T22:41:17.846151" elapsed="0.000235"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.846654" level="INFO">交易对字典包含 3 个字段</msg>
<arg>交易对字典包含 ${count} 个字段</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:17.846503" elapsed="0.000192"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.847557" level="INFO">交易对字典内容: {'time': 1779979277756, '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-28T22:41:17.846791" elapsed="0.001300"/>
</kw>
<arg>${data}</arg>
<doc>验证交易对字典的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:17.845015" elapsed="0.003199"/>
</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-28T22:41:17.844578" elapsed="0.003689"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.849708" 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-28T22:41:17.849162" elapsed="0.000575"/>
</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-28T22:41:17.850002" elapsed="0.000688"/>
</kw>
<msg time="2026-05-28T22:41:17.850843" 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-28T22:41:17.849860" elapsed="0.001019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.851298" 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-28T22:41:17.851074" elapsed="0.000256"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.851735" 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-28T22:41:17.851473" elapsed="0.000293"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.852089" 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-28T22:41:17.851899" elapsed="0.000219"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.852554" 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-28T22:41:17.852244" elapsed="0.000343"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.852945" 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-28T22:41:17.852717" elapsed="0.000261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.853252" 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-28T22:41:17.853105" elapsed="0.000199"/>
</kw>
<arg>获取市场交易对列表</arg>
<arg>/v1/spot/market/public/symbol</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T22:41:17.848608" elapsed="0.004769"/>
</kw>
<doc>验证市场交易对接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T22:41:17.380757" elapsed="0.472788"/>
</test>
<doc>市场交易对接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:17.371579" elapsed="0.482522"/>
</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-28T22:41:17.859671" 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-28T22:41:17.859480" elapsed="0.000221"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.860318" 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-28T22:41:17.860186" elapsed="0.000177"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:17.859786" elapsed="0.000610"/>
</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-28T22:41:17.860513" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:17.860420" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:17.859763" elapsed="0.000813"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.861194" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:17.861074" 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-28T22:41:17.861468" 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-28T22:41:17.861590" 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-28T22:41:17.861697" 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-28T22:41:17.861835" elapsed="0.000036"/>
</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-28T22:41:17.862008" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:17.861299" elapsed="0.000854"/>
</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-28T22:41:17.862351" 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-28T22:41:17.862457" 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-28T22:41:17.862555" 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-28T22:41:17.862648" 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-28T22:41:17.862745" 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-28T22:41:17.862838" 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-28T22:41:17.862929" 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-28T22:41:17.863019" 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-28T22:41:17.863111" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:17.862179" elapsed="0.000972"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.863468" 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-28T22:41:17.863249" elapsed="0.000259"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.863778" 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-28T22:41:17.863600" elapsed="0.000215"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.864074" 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-28T22:41:17.863904" elapsed="0.000204"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.864370" 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-28T22:41:17.864197" elapsed="0.000207"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.864664" 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-28T22:41:17.864491" elapsed="0.000207"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.864956" 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-28T22:41:17.864786" elapsed="0.000203"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.865263" 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-28T22:41:17.865079" elapsed="0.000217"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.865564" 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-28T22:41:17.865383" elapsed="0.000213"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.865869" 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-28T22:41:17.865683" elapsed="0.000219"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:17.863171" elapsed="0.002759"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:17.861283" elapsed="0.004665"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.866163" 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-28T22:41:17.866027" elapsed="0.000174"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:17.866540" 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-28T22:41:17.866290" elapsed="0.000415"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:17.860832" elapsed="0.005932"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:17.866933" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:17.866854" elapsed="0.000115"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:17.859229" elapsed="0.007790"/>
</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-28T22:41:17.869581" 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-28T22:41:17.868890" elapsed="0.000725"/>
</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-28T22:41:17.870301" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:17.869830" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:17.869801" elapsed="0.000569"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:17.870398" elapsed="0.000029"/>
</return>
<msg time="2026-05-28T22:41:17.870559" 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-28T22:41:17.868195" elapsed="0.002384"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:18.135383" 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-28T22:41:18.135765" 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 14:41: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-Forwarded-For': '103.151.172.73', 'X-Trace-ID': '55d39f5828e5065f9447b70bf0e07a25', 'X-Transparent': '00-55d39f5828e5065f9447b70bf0e07a25-90fca8766b94d0fd-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': 'a02e04f7fd5708d9-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"serverTime":1779979278121},"ts":1779979278121} 
 </msg>
<msg time="2026-05-28T22:41:18.135928" 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-28T22:41:18.136503" 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-28T22:41:17.871242" elapsed="0.265328"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:18.136807" elapsed="0.000114"/>
</return>
<msg time="2026-05-28T22:41:18.137253" 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-28T22:41:17.870697" elapsed="0.266610"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.138865" 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-28T22:41:18.138074" elapsed="0.000904"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.140294" 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-28T22:41:18.139356" elapsed="0.000974"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.140639" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:18.140482" elapsed="0.000371"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:18.137660" elapsed="0.003467"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.142745" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'serverTime': 1779979278121}, 'ts': 1779979278121}</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-28T22:41:18.142073" elapsed="0.000721"/>
</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-28T22:41:18.142996" elapsed="0.000241"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.143498" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:18.143352" elapsed="0.000188"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T22:41:18.141583" elapsed="0.002061"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.146062" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'serverTime': 1779979278121}, 'ts': 1779979278121}</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-28T22:41:18.144897" elapsed="0.001259"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.147622" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "serverTime": 1779979278121
  },
  "ts": 1779979278121
}</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-28T22:41:18.146496" elapsed="0.001476"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.149034" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "serverTime": 1779979278121
  },
  "ts": 1779979278121
}</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-28T22:41:18.148477" elapsed="0.000737"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T22:41:18.144038" elapsed="0.005293"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:18.150477" level="INFO">${data} = {'serverTime': 1779979278121}</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-28T22:41:18.149535" elapsed="0.000983"/>
</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-28T22:41:18.150702" elapsed="0.000367"/>
</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-28T22:41:18.151684" elapsed="0.000209"/>
</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-28T22:41:18.152035" elapsed="0.000212"/>
</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-28T22:41:18.153124" elapsed="0.000230"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.153622" level="INFO">时间字典内容: {'serverTime': 1779979278121}</msg>
<arg>时间字典内容: ${time_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:18.153469" elapsed="0.000202"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:18.154148" 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-28T22:41:18.153936" elapsed="0.000292">Dictionary does not contain key 'timestamp'.</status>
</kw>
<msg time="2026-05-28T22:41:18.154323" 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-28T22:41:18.153798" elapsed="0.000551"/>
</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-28T22:41:18.154479" elapsed="0.000116"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:18.155255" 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-28T22:41:18.154857" elapsed="0.000562">Dictionary does not contain key 'time'.</status>
</kw>
<msg time="2026-05-28T22:41:18.156462" 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-28T22:41:18.154715" elapsed="0.001886"/>
</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-28T22:41:18.156979" elapsed="0.000564"/>
</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-28T22:41:18.157870" elapsed="0.000159"/>
</kw>
<msg time="2026-05-28T22:41:18.158125" 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-28T22:41:18.157744" elapsed="0.000406"/>
</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-28T22:41:18.159403" elapsed="0.000291"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.160000" level="INFO">${timestamp_str} = 1779979278121</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:41:18.159818" elapsed="0.000206"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.160222" level="INFO">Length is 13.</msg>
<msg time="2026-05-28T22:41:18.160283" 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-28T22:41:18.160123" elapsed="0.000180"/>
</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-28T22:41:18.160398" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.160891" level="INFO">服务器时间戳: 1779979278121</msg>
<arg>服务器时间戳: ${timestamp}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:18.160784" elapsed="0.000144"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="转换毫秒时间戳">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.161785" level="INFO">${seconds} = 1779979278</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-28T22:41:18.161606" elapsed="0.000208"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.162041" level="INFO">毫秒时间戳 1779979278121 对应秒级时间戳: 1779979278</msg>
<arg>毫秒时间戳 ${milliseconds} 对应秒级时间戳: ${seconds}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:18.161910" elapsed="0.000167"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.162399" level="INFO">${readable_time} = 2026-05-28 22:41:18</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-28T22:41:18.162164" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.162838" level="INFO">可读时间格式: 2026-05-28 22:41:18</msg>
<arg>可读时间格式: ${readable_time}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:18.162727" elapsed="0.000146"/>
</kw>
<arg>${timestamp}</arg>
<doc>转换毫秒级时间戳为可读格式</doc>
<status status="PASS" start="2026-05-28T22:41:18.161308" elapsed="0.001625"/>
</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-28T22:41:18.161033" elapsed="0.001949"/>
</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-28T22:41:18.163089" elapsed="0.000301"/>
</kw>
<arg>${time_dict['serverTime']}</arg>
<doc>验证时间戳的格式和有效性</doc>
<status status="PASS" start="2026-05-28T22:41:18.158587" elapsed="0.004988"/>
</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-28T22:41:18.158274" elapsed="0.005496"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:18.164740" 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-28T22:41:18.164458" elapsed="0.000372">Dictionary does not contain key 'currentTime'.</status>
</kw>
<msg time="2026-05-28T22:41:18.165137" 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-28T22:41:18.164190" elapsed="0.001012"/>
</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-28T22:41:18.165413" elapsed="0.000190"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-05-28T22:41:18.165964" 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-28T22:41:18.165748" elapsed="0.000248"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.166255" level="INFO">Length is 1.</msg>
<msg time="2026-05-28T22:41:18.166336" 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-28T22:41:18.166120" elapsed="0.000243"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.166678" 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-28T22:41:18.166483" elapsed="0.000247"/>
</kw>
<arg>${time_data}</arg>
<doc>验证时间字典的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:18.152777" elapsed="0.014036"/>
</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-28T22:41:18.152391" elapsed="0.014476"/>
</kw>
<arg>${data}</arg>
<doc>验证时间数据的格式和有效性</doc>
<status status="PASS" start="2026-05-28T22:41:18.151299" elapsed="0.015630"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.168210" 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-28T22:41:18.167579" elapsed="0.000662"/>
</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-28T22:41:18.168534" elapsed="0.000533"/>
</kw>
<msg time="2026-05-28T22:41:18.169150" 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-28T22:41:18.168373" elapsed="0.000801"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.169426" 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-28T22:41:18.169288" elapsed="0.000161"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.169756" 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-28T22:41:18.169558" elapsed="0.000222"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.170044" 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-28T22:41:18.169888" elapsed="0.000195"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.170457" 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-28T22:41:18.170198" elapsed="0.000293"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.170780" 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-28T22:41:18.170594" elapsed="0.000212"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.171021" 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-28T22:41:18.170909" elapsed="0.000216"/>
</kw>
<arg>获取市场服务器时间</arg>
<arg>/v1/spot/market/public/time</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T22:41:18.167175" elapsed="0.004003"/>
</kw>
<doc>验证市场服务器时间接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T22:41:17.867088" elapsed="0.304224"/>
</test>
<doc>市场服务器时间接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:17.855286" elapsed="0.316310"/>
</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-28T22:41:18.176605" 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-28T22:41:18.176420" elapsed="0.000214"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.176998" 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-28T22:41:18.176895" elapsed="0.000140"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:18.176726" elapsed="0.000336"/>
</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-28T22:41:18.177165" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:18.177086" elapsed="0.000119"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:18.176699" elapsed="0.000522"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.177797" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:18.177697" elapsed="0.000136"/>
</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-28T22:41:18.178036" 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-28T22:41:18.178136" 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-28T22:41:18.178229" 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-28T22:41:18.178321" 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-28T22:41:18.178412" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:18.177885" elapsed="0.000567"/>
</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-28T22:41:18.178593" 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-28T22:41:18.178689" 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-28T22:41:18.178782" 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-28T22:41:18.178872" 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-28T22:41:18.178959" elapsed="0.000013"/>
</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-28T22:41:18.179048" 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-28T22:41:18.179135" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:18.179222" 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-28T22:41:18.179307" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:18.178470" elapsed="0.000875"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.179615" 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-28T22:41:18.179437" elapsed="0.000211"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.179906" 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-28T22:41:18.179732" elapsed="0.000204"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.180182" 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-28T22:41:18.180020" elapsed="0.000193"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.180459" 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-28T22:41:18.180296" elapsed="0.000194"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.180741" 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-28T22:41:18.180573" elapsed="0.000199"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.181059" 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-28T22:41:18.180884" elapsed="0.000207"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.181354" 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-28T22:41:18.181177" elapsed="0.000209"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.181648" 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-28T22:41:18.181473" elapsed="0.000207"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.181943" 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-28T22:41:18.181766" elapsed="0.000208"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:18.179363" elapsed="0.002638"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:18.177872" elapsed="0.004145"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.182212" 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-28T22:41:18.182091" elapsed="0.000156"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:18.182555" 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-28T22:41:18.182330" elapsed="0.000362"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:18.177475" elapsed="0.005272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.182900" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:18.182830" elapsed="0.000103"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:18.176195" elapsed="0.006780"/>
</kw>
<test id="s1-s4-s2-s6-t1" name="获取热门市场排行榜" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.184288" 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-28T22:41:18.184007" elapsed="0.000303"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.185505" 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-28T22:41:18.185039" 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-28T22:41:18.185985" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:18.185613" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:18.185600" elapsed="0.000443"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:18.186069" elapsed="0.000033"/>
</return>
<msg time="2026-05-28T22:41:18.186224" 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-28T22:41:18.184464" elapsed="0.001779"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:18.563765" 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-28T22:41:18.564075" 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 14:41: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-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'fd35fb104fabc0c4412de44b000e5db8', 'X-Transparent': '00-fd35fb104fabc0c4412de44b000e5db8-464f024c4c973d72-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': 'a02e04fa6d3a1066-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":[],"ts":1779979278519} 
 </msg>
<msg time="2026-05-28T22:41:18.564190" 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-28T22:41:18.564537" 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-28T22:41:18.186638" elapsed="0.377957"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:18.564731" elapsed="0.000160"/>
</return>
<msg time="2026-05-28T22:41:18.565237" 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-28T22:41:18.186344" elapsed="0.378938"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.567127" 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-28T22:41:18.566456" elapsed="0.000759"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.568387" 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-28T22:41:18.567396" elapsed="0.001060"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.569149" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:18.568772" elapsed="0.000514"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:18.565683" elapsed="0.003779"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.571551" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [], 'ts': 1779979278519}</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-28T22:41:18.570587" elapsed="0.001020"/>
</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-28T22:41:18.571832" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.572546" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:18.572325" elapsed="0.000293"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T22:41:18.569961" elapsed="0.002787"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.574401" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [], 'ts': 1779979278519}</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-28T22:41:18.573565" elapsed="0.000881"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.575205" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [],
  "ts": 1779979278519
}</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-28T22:41:18.574605" elapsed="0.000702"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.575946" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [],
  "ts": 1779979278519
}</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-28T22:41:18.575567" elapsed="0.000553"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T22:41:18.573052" elapsed="0.003175"/>
</kw>
<doc>验证热门市场排行榜接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T22:41:18.183027" elapsed="0.393616"/>
</test>
<doc>热门市场排行榜接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:18.172547" elapsed="0.404588"/>
</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-28T22:41:18.587142" 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-28T22:41:18.586925" elapsed="0.000254"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.587676" 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-28T22:41:18.587521" elapsed="0.000204"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:18.587282" elapsed="0.000475"/>
</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-28T22:41:18.587872" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:18.587784" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:18.587256" elapsed="0.000679"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.590137" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:18.589062" elapsed="0.001262"/>
</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-28T22:41:18.590879" elapsed="0.000033"/>
</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-28T22:41:18.591047" elapsed="0.000026"/>
</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-28T22:41:18.591192" 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-28T22:41:18.591322" 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-28T22:41:18.591557" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:18.590540" elapsed="0.001076"/>
</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-28T22:41:18.591871" 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-28T22:41:18.592012" 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-28T22:41:18.592146" 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-28T22:41:18.592275" 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-28T22:41:18.592403" elapsed="0.000022"/>
</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-28T22:41:18.592540" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:41:18.592666" 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-28T22:41:18.592795" 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-28T22:41:18.592918" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:18.591659" elapsed="0.001313"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.593459" 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-28T22:41:18.593106" elapsed="0.000409"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.593880" 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-28T22:41:18.593640" elapsed="0.000282"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.594329" 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-28T22:41:18.594026" elapsed="0.000372"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.594777" 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-28T22:41:18.594535" elapsed="0.000287"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.595208" 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-28T22:41:18.594942" elapsed="0.000315"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.595594" 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-28T22:41:18.595374" elapsed="0.000261"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.596401" 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-28T22:41:18.595769" elapsed="0.000736"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.597002" 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-28T22:41:18.596712" elapsed="0.000339"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.597391" 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-28T22:41:18.597168" elapsed="0.000263"/>
</kw>
<status status="PASS" start="2026-05-28T22:41:18.592998" elapsed="0.004469"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:18.590492" elapsed="0.007008"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.597854" 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-28T22:41:18.597634" elapsed="0.000271"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:18.598311" 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-28T22:41:18.598011" elapsed="0.000688"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:41:18.588363" elapsed="0.010416"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.598988" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:18.598891" elapsed="0.000142"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:41:18.586377" elapsed="0.012710"/>
</kw>
<test id="s1-s4-s2-s7-t1" name="获取最近交易记录" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.603747" 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-28T22:41:18.603463" elapsed="0.000315"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.606129" 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-28T22:41:18.604981" elapsed="0.001195"/>
</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-28T22:41:18.607045" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:41:18.606326" elapsed="0.000786"/>
</branch>
<status status="PASS" start="2026-05-28T22:41:18.606300" elapsed="0.000836"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:41:18.607173" elapsed="0.000036"/>
</return>
<msg time="2026-05-28T22:41:18.607387" 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-28T22:41:18.604173" elapsed="0.003240"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:41:18.949917" 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-28T22:41:18.950056" 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 14:41: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-Forwarded-For': '103.151.172.73', 'X-Trace-ID': 'f0c59c357336eba3279bd2425de68673', 'X-Transparent': '00-f0c59c357336eba3279bd2425de68673-917116843a14225b-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': 'a02e04fd0e4f08f1-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":[{"i":630308588142771520,"t":1779979278141,"p":"72985.86","q":"0.011890","v":"867.8018754","b":false},{"i":630308587123555648,"t":1779979277789,"p":"72985.86","q":"0.011370","v":"829.8492282","b":false},{"i":630308586234363200,"t":1779979277566,"p":"72985.87","q":"0.013430","v":"980.2002341","b":true},{"i":630308585345170752,"t":1779979277366,"p":"72985.87","q":"0.017280","v":"1261.1958336","b":true},{"i":630308584158182720,"t":1779979277177,"p":"72985.86","q":"0.011520","v":"840.7971072","b":false},{"i":630308583268990272,"t":1779979276966,"p":"72985.87","q":"0.016270","v":"1187.4801049","b":true},{"i":630308582132333888,"t":1779979276596,"p":"72985.87","q":"0.015750","v":"1149.5274525","b":true},{"i":630308581243141440,"t":1779979276487,"p":"72985.86","q":"0.017080","v":"1246.5984888","b":false},{"i":630308580345560384,"t":1779979276182,"p":"72976.00","q":"0.010690","v":"780.11344","b":false},{"i":630308579456367936,"t":1779979275973,"p":"72976.01","q":"0.016120","v":"1176.3732812","b":true},{"i":630308578273574208,"t":1779979275798,"p":"72976.00","q":"0.012180","v":"888.84768","b":false},{"i":630308577086586176,"t":1779979275391,"p":"72976.01","q":"0.019670","v":"1435.4381167","b":true},{"i":630308575555665216,"t":1779979275080,"p":"72976.01","q":"0.017780","v":"1297.5134578","b":true},{"i":630308574666472768,"t":1779979274821,"p":"72976.00","q":"0.017060","v":"1244.97056","b":false},{"i":630308573777280320,"t":1779979274603,"p":"72976.00","q":"0.015050","v":"1098.2888","b":false},{"i":630308572888087872,"t":1779979274478,"p":"72976.00","q":"0.019780","v":"1443.46528","b":false},{"i":630308571327806784,"t":1779979274122,"p":"72976.01","q":"0.013530","v":"987.3654153","b":true},{"i":630308570442808640,"t":1779979273808,"p":"72976.00","q":"0.017010","v":"1241.32176","b":false},{"i":630308569520061760,"t":1779979273694,"p":"72976.01","q":"0.019090","v":"1393.1120309","b":true},{"i":630308568131747136,"t":1779979273283,"p":"72976.00","q":"0.019690","v":"1436.89744","b":false},{"i":630308566944759104,"t":1779979273074,"p":"72976.01","q":"0.019840","v":"1447.8440384","b":true},{"i":630308565766159680,"t":1779979272692,"p":"72976.01","q":"0.020430","v":"1490.8998843","b":true},{"i":630308564876967232,"t":1779979272493,"p":"72976.00","q":"0.018920","v":"1380.70592","b":false},{"i":630308563652230464,"t":1779979272285,"p":"72976.01","q":"0.016230","v":"1184.4006423","b":true},{"i":630308562196806976,"t":1779979271891,"p":"72976.00","q":"0.020260","v":"1478.49376","b":false},{"i":630308561311808832,"t":1779979271634,"p":"72976.01","q":"0.015040","v":"1097.5591904","b":true},{"i":630308560338730304,"t":1779979271513,"p":"72976.00","q":"0.018280","v":"1334.00128","b":false},{"i":630308558900084032,"t":1779979271172,"p":"72982.88","q":"0.015740","v":"1148.7505312","b":false},{"i":630308558002502976,"t":1779979270837,"p":"72987.35","q":"0.014500","v":"1058.316575","b":false},{"i":630308557062978880,"t":1779979270632,"p":"72987.35","q":"0.014650","v":"1069.2646775","b":false}],"ts":1779979278939} 
 </msg>
<msg time="2026-05-28T22:41:18.950129" 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-28T22:41:18.950279" 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-28T22:41:18.608015" elapsed="0.342284"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-05-28T22:41:18.950390" elapsed="0.000043"/>
</return>
<msg time="2026-05-28T22:41:18.950563" 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-28T22:41:18.607579" elapsed="0.343005"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.951451" 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-28T22:41:18.951052" elapsed="0.000449"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.951963" 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-28T22:41:18.951606" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.952172" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:18.952069" elapsed="0.000150"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-05-28T22:41:18.950775" elapsed="0.001489"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.953184" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [{'i': 630308588142771520, 't': 1779979278141, 'p': '72985.86', 'q': '0.011890', 'v': '867.8018754', 'b': False}, {'i': 630308587123555648, '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-28T22:41:18.952629" elapsed="0.000580"/>
</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-28T22:41:18.953296" elapsed="0.000133"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.953604" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:18.953512" elapsed="0.000121"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-05-28T22:41:18.952391" elapsed="0.001279"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.954331" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [{'i': 630308588142771520, 't': 1779979278141, 'p': '72985.86', 'q': '0.011890', 'v': '867.8018754', 'b': False}, {'i': 630308587123555648, '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-28T22:41:18.953957" elapsed="0.000395"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.955845" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [
    {
      "i": 630308588142771520,
      "t": 1779979278141,
      "p": "72985.86",
      "q": "0.011890",
      "v": "867.8018754",
 ...</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-28T22:41:18.954423" elapsed="0.001442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.956053" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [
    {
      "i": 630308588142771520,
      "t": 1779979278141,
      "p": "72985.86",
      "q": "0.011890",
      "v": "867.8018754",
      "b": false
    },
    {
      "i": 630308587123555648,
      "t": 1779979277789,
      "p": "72985.86",
      "q": "0.011370",
      "v": "829.8492282",
      "b": false
    },
    {
      "i": 630308586234363200,
      "t": 1779979277566,
      "p": "72985.87",
      "q": "0.013430",
      "v": "980.2002341",
      "b": true
    },
    {
      "i": 630308585345170752,
      "t": 1779979277366,
      "p": "72985.87",
      "q": "0.017280",
      "v": "1261.1958336",
      "b": true
    },
    {
      "i": 630308584158182720,
      "t": 1779979277177,
      "p": "72985.86",
      "q": "0.011520",
      "v": "840.7971072",
      "b": false
    },
    {
      "i": 630308583268990272,
      "t": 1779979276966,
      "p": "72985.87",
      "q": "0.016270",
      "v": "1187.4801049",
      "b": true
    },
    {
      "i": 630308582132333888,
      "t": 1779979276596,
      "p": "72985.87",
      "q": "0.015750",
      "v": "1149.5274525",
      "b": true
    },
    {
      "i": 630308581243141440,
      "t": 1779979276487,
      "p": "72985.86",
      "q": "0.017080",
      "v": "1246.5984888",
      "b": false
    },
    {
      "i": 630308580345560384,
      "t": 1779979276182,
      "p": "72976.00",
      "q": "0.010690",
      "v": "780.11344",
      "b": false
    },
    {
      "i": 630308579456367936,
      "t": 1779979275973,
      "p": "72976.01",
      "q": "0.016120",
      "v": "1176.3732812",
      "b": true
    },
    {
      "i": 630308578273574208,
      "t": 1779979275798,
      "p": "72976.00",
      "q": "0.012180",
      "v": "888.84768",
      "b": false
    },
    {
      "i": 630308577086586176,
      "t": 1779979275391,
      "p": "72976.01",
      "q": "0.019670",
      "v": "1435.4381167",
      "b": true
    },
    {
      "i": 630308575555665216,
      "t": 1779979275080,
      "p": "72976.01",
      "q": "0.017780",
      "v": "1297.5134578",
      "b": true
    },
    {
      "i": 630308574666472768,
      "t": 1779979274821,
      "p": "72976.00",
      "q": "0.017060",
      "v": "1244.97056",
      "b": false
    },
    {
      "i": 630308573777280320,
      "t": 1779979274603,
      "p": "72976.00",
      "q": "0.015050",
      "v": "1098.2888",
      "b": false
    },
    {
      "i": 630308572888087872,
      "t": 1779979274478,
      "p": "72976.00",
      "q": "0.019780",
      "v": "1443.46528",
      "b": false
    },
    {
      "i": 630308571327806784,
      "t": 1779979274122,
      "p": "72976.01",
      "q": "0.013530",
      "v": "987.3654153",
      "b": true
    },
    {
      "i": 630308570442808640,
      "t": 1779979273808,
      "p": "72976.00",
      "q": "0.017010",
      "v": "1241.32176",
      "b": false
    },
    {
      "i": 630308569520061760,
      "t": 1779979273694,
      "p": "72976.01",
      "q": "0.019090",
      "v": "1393.1120309",
      "b": true
    },
    {
      "i": 630308568131747136,
      "t": 1779979273283,
      "p": "72976.00",
      "q": "0.019690",
      "v": "1436.89744",
      "b": false
    },
    {
      "i": 630308566944759104,
      "t": 1779979273074,
      "p": "72976.01",
      "q": "0.019840",
      "v": "1447.8440384",
      "b": true
    },
    {
      "i": 630308565766159680,
      "t": 1779979272692,
      "p": "72976.01",
      "q": "0.020430",
      "v": "1490.8998843",
      "b": true
    },
    {
      "i": 630308564876967232,
      "t": 1779979272493,
      "p": "72976.00",
      "q": "0.018920",
      "v": "1380.70592",
      "b": false
    },
    {
      "i": 630308563652230464,
      "t": 1779979272285,
      "p": "72976.01",
      "q": "0.016230",
      "v": "1184.4006423",
      "b": true
    },
    {
      "i": 630308562196806976,
      "t": 1779979271891,
      "p": "72976.00",
      "q": "0.020260",
      "v": "1478.49376",
      "b": false
    },
    {
      "i": 630308561311808832,
      "t": 1779979271634,
      "p": "72976.01",
      "q": "0.015040",
      "v": "1097.5591904",
      "b": true
    },
    {
      "i": 630308560338730304,
      "t": 1779979271513,
      "p": "72976.00",
      "q": "0.018280",
      "v": "1334.00128",
      "b": false
    },
    {
      "i": 630308558900084032,
      "t": 1779979271172,
      "p": "72982.88",
      "q": "0.015740",
      "v": "1148.7505312",
      "b": false
    },
    {
      "i": 630308558002502976,
      "t": 1779979270837,
      "p": "72987.35",
      "q": "0.014500",
      "v": "1058.316575",
      "b": false
    },
    {
      "i": 630308557062978880,
      "t": 1779979270632,
      "p": "72987.35",
      "q": "0.014650",
      "v": "1069.2646775",
      "b": false
    }
  ],
  "ts": 1779979278939
}</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-28T22:41:18.955939" elapsed="0.000214"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-05-28T22:41:18.953770" elapsed="0.002422"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:41:18.956624" level="INFO">${data} = [{'i': 630308588142771520, 't': 1779979278141, 'p': '72985.86', 'q': '0.011890', 'v': '867.8018754', 'b': False}, {'i': 630308587123555648, 't': 1779979277789, 'p': '72985.86', 'q': '0.011370', '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-28T22:41:18.956261" elapsed="0.000380"/>
</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-28T22:41:18.956725" elapsed="0.000158"/>
</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-28T22:41:18.957372" elapsed="0.000119"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.957635" level="INFO">Length is 30.</msg>
<msg time="2026-05-28T22:41:18.957678" 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-28T22:41:18.957555" elapsed="0.000137"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.957827" level="INFO">交易记录列表包含 30 个交易记录</msg>
<arg>交易记录列表包含 ${list_length} 个交易记录</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:18.957752" elapsed="0.000101"/>
</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-28T22:41:18.958481" elapsed="0.000119"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.958740" level="INFO">交易记录项内容: {'i': 630308588142771520, 't': 1779979278141, 'p': '72985.86', 'q': '0.011890', 'v': '867.8018754', 'b': False}</msg>
<arg>交易记录项内容: ${trade_item}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:41:18.958664" elapsed="0.000102"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:18.959031" 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-28T22:41:18.958909" elapsed="0.000183">Dictionary does not contain key 'id'.</status>
</kw>
<msg time="2026-05-28T22:41:18.959182" 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-28T22:41:18.958829" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:18.959440" 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-28T22:41:18.959343" elapsed="0.000130">Dictionary does not contain key 'price'.</status>
</kw>
<msg time="2026-05-28T22:41:18.959524" 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-28T22:41:18.959265" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:18.959775" 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-28T22:41:18.959681" elapsed="0.000125">Dictionary does not contain key 'qty'.</status>
</kw>
<msg time="2026-05-28T22:41:18.959857" 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-28T22:41:18.959604" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:18.960189" 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-28T22:41:18.960012" elapsed="0.000208">Dictionary does not contain key 'quoteQty'.</status>
</kw>
<msg time="2026-05-28T22:41:18.960271" 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-28T22:41:18.959936" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:18.960527" 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-28T22:41:18.960428" elapsed="0.000129">Dictionary does not contain key 'time'.</status>
</kw>
<msg time="2026-05-28T22:41:18.960613" 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-28T22:41:18.960351" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:18.960865" 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-28T22:41:18.960771" elapsed="0.000125">Dictionary does not contain key 'isBuyerMaker'.</status>
</kw>
<msg time="2026-05-28T22:41:18.960947" 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-28T22:41:18.960694" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:18.961198" 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-28T22:41:18.961103" elapsed="0.000125">Dictionary does not contain key 'side'.</status>
</kw>
<msg time="2026-05-28T22:41:18.961317" 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-28T22:41:18.961027" elapsed="0.000304"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:41:18.961579" 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-28T22:41:18.961475" elapsed="0.000136">Dictionary does not contain key 'symbol'.</status>
</kw>
<msg time="2026-05-28T22:41:18.961662" 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-28T22:41:18.961399" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.961817" 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-28T22:41:18.961741" elapsed="0.000101"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.962019" 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-28T22:41:18.961947" elapsed="0.000095"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.962169" 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-28T22:41:18.962099" elapsed="0.000095"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.962320" 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-28T22:41:18.962252" elapsed="0.000093"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.962468" 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-28T22:41:18.962402" elapsed="0.000089"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.962625" 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-28T22:41:18.962553" elapsed="0.000097"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.962894" 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-28T22:41:18.962780" elapsed="0.000149"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.963089" 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-28T22:41:18.963002" elapsed="0.000117"/>
</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-28T22:41:18.963191" elapsed="0.000072"/>
</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-28T22:41:18.963337" elapsed="0.000069"/>
</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-28T22:41:18.963642" elapsed="0.000101"/>
</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-28T22:41:18.963826" elapsed="0.000067"/>
</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-28T22:41:18.963967" elapsed="0.000063"/>
</kw>
<arg>${trade_list[0]}</arg>
<doc>验证单个交易记录的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:18.958096" elapsed="0.005979"/>
</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-28T22:41:18.957916" elapsed="0.006187"/>
</kw>
<arg>${data}</arg>
<doc>验证交易记录列表的数据结构</doc>
<status status="PASS" start="2026-05-28T22:41:18.957182" elapsed="0.006973"/>
</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-28T22:41:18.956967" elapsed="0.007221"/>
</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-28T22:41:18.964262" elapsed="0.000188"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.965195" 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-28T22:41:18.964884" elapsed="0.000327"/>
</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-28T22:41:18.965366" elapsed="0.000268"/>
</kw>
<msg time="2026-05-28T22:41:18.965683" 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-28T22:41:18.965276" elapsed="0.000422"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.965849" 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-28T22:41:18.965766" elapsed="0.000097"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.966043" 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-28T22:41:18.965927" elapsed="0.000131"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.966216" 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-28T22:41:18.966123" elapsed="0.000108"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.966441" 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-28T22:41:18.966292" elapsed="0.000166"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.966634" 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-28T22:41:18.966521" elapsed="0.000129"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:41:18.966783" 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-28T22:41:18.966713" elapsed="0.000096"/>
</kw>
<arg>获取最近交易记录</arg>
<arg>/v1/spot/market/public/trade/recent</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-05-28T22:41:18.964623" elapsed="0.002216"/>
</kw>
<doc>验证最近交易记录接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-05-28T22:41:18.599160" elapsed="0.367760"/>
</test>
<doc>最近交易记录接口测试</doc>
<status status="PASS" start="2026-05-28T22:41:18.578771" elapsed="0.388491"/>
</suite>
<status status="PASS" start="2026-05-28T22:41:16.349256" elapsed="2.618634"/>
</suite>
<status status="PASS" start="2026-05-28T22:41:15.302024" elapsed="3.666269"/>
</suite>
<status status="PASS" start="2026-05-28T22:41:02.791928" elapsed="16.176881"/>
</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>
