<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.3.2 (Python 3.9.6 on darwin)" generated="2026-04-19T18:04:02.196915" 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-04-19T18:04:02.285971" 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-04-19T18:04:02.285876" elapsed="0.000111"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:02.286165" 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-04-19T18:04:02.286108" elapsed="0.000075"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:02.286030" elapsed="0.000167"/>
</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-04-19T18:04:02.286245" elapsed="0.000006"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:02.286207" elapsed="0.000056"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:02.286020" elapsed="0.000251"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:02.286543" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:02.286496" elapsed="0.000064"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:02.286644" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:02.286689" 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-04-19T18:04:02.286732" 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-04-19T18:04:02.286774" 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-04-19T18:04:02.286816" elapsed="0.000006"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:02.286584" elapsed="0.000249"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:02.286898" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:02.286942" elapsed="0.000006"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:02.286985" elapsed="0.000006"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:02.287025" 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-04-19T18:04:02.287071" 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-04-19T18:04:02.287111" elapsed="0.000006"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:02.287152" 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-04-19T18:04:02.287192" elapsed="0.000006"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:02.287232" elapsed="0.000006"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:02.286841" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:02.287584" 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-04-19T18:04:02.287292" elapsed="0.000308"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:02.287889" 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-04-19T18:04:02.287646" elapsed="0.000260"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:02.288197" 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-04-19T18:04:02.287947" elapsed="0.000265"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:02.288504" 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-04-19T18:04:02.288255" elapsed="0.000265"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:02.288825" 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-04-19T18:04:02.288562" elapsed="0.000281"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:02.289160" 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-04-19T18:04:02.288886" elapsed="0.000292"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:02.289505" 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-04-19T18:04:02.289257" elapsed="0.000264"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:02.289819" 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-04-19T18:04:02.289562" elapsed="0.000274"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:02.290143" 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-04-19T18:04:02.289880" elapsed="0.000280"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:02.287258" elapsed="0.002917"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:02.286578" elapsed="0.003605"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:02.290285" 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-04-19T18:04:02.290222" elapsed="0.000080"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:02.290477" 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-04-19T18:04:02.290341" elapsed="0.000215"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:02.286385" elapsed="0.004197"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:02.290655" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:02.290623" elapsed="0.000047"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:02.285562" elapsed="0.005127"/>
</kw>
<test id="s1-s1-s1-t1" name="获取广告列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:02.291687" 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-04-19T18:04:02.291406" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:02.291957" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:02.291751" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:02.291743" elapsed="0.000245"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:02.292001" elapsed="0.000015"/>
</return>
<msg time="2026-04-19T18:04:02.292082" 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-04-19T18:04:02.291110" elapsed="0.000982"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:03.575436" 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-04-19T18:04:03.576029" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/app/public/ad/list 
 status=200, reason=OK 
 headers={'Date': 'Sun, 19 Apr 2026 10:04: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': '141.11.146.71', 'X-Trace-ID': 'f175ae64c6ab1c246bfe6177db0f625d', 'X-Transparent': '00-f175ae64c6ab1c246bfe6177db0f625d-576f98ca89cf9b89-01', 'X-Upstream-Addr': '10.9.149.153:8080', 'X-Upstream-Header-Time': '0.025', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': '9eeb1538ec4b8ca6-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":[],"msg":"Success.","msgInfo":{"template":"Success."},"ts":1776593043534} 
 </msg>
<msg time="2026-04-19T18:04:03.576256" 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-04-19T18:04:03.576776" 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-04-19T18:04:02.292133" elapsed="1.284769"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.579233" 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-04-19T18:04:03.577647" elapsed="0.001766"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.581513" level="INFO">${resp_json} = {'code': 0, 'data': [], 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1776593043534}</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-04-19T18:04:03.579935" elapsed="0.001659"/>
</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-04-19T18:04:03.581955" elapsed="0.000459"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.583704" level="INFO">${json_str} = {
  "code": 0,
  "data": [],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1776593043534
}</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-04-19T18:04:03.582702" elapsed="0.001069"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.584463" level="INFO">{
  "code": 0,
  "data": [],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1776593043534
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:03.584049" elapsed="0.000644"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:03.586007" 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-04-19T18:04:03.584922" elapsed="0.001135"/>
</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-04-19T18:04:03.586281" elapsed="0.000457"/>
</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-04-19T18:04:03.588329" elapsed="0.000349"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.588992" level="INFO">Length is 0.</msg>
<msg time="2026-04-19T18:04:03.589091" 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-04-19T18:04:03.588844" elapsed="0.000277"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.589557" level="INFO">广告列表包含 0 个广告项</msg>
<arg>广告列表包含 ${length} 个广告项</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:03.589341" elapsed="0.000282"/>
</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-04-19T18:04:03.589786" elapsed="0.000187"/>
</kw>
<arg>${data}</arg>
<doc>验证广告列表的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:03.587787" elapsed="0.002290"/>
</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-04-19T18:04:03.586969" elapsed="0.003182"/>
</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-04-19T18:04:03.590299" elapsed="0.000215"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.591340" 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-04-19T18:04:03.590651" elapsed="0.000747"/>
</kw>
<doc>验证广告列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-04-19T18:04:02.290713" elapsed="1.300887"/>
</test>
<doc>广告列表接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:02.206443" elapsed="1.385961"/>
</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-04-19T18:04:03.599639" 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-04-19T18:04:03.599382" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.602800" 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-04-19T18:04:03.600089" elapsed="0.002793"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:03.599818" elapsed="0.003118"/>
</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-04-19T18:04:03.603125" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:03.602977" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:03.599780" elapsed="0.003415"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.604039" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:03.603905" elapsed="0.000181"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:03.604346" 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-04-19T18:04:03.604684" elapsed="0.000053"/>
</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-04-19T18:04:03.604888" elapsed="0.000025"/>
</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-04-19T18:04:03.605030" 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-04-19T18:04:03.605161" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:03.604160" elapsed="0.001124"/>
</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-04-19T18:04:03.605603" elapsed="0.000025"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:03.605751" 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-04-19T18:04:03.605885" elapsed="0.000024"/>
</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-04-19T18:04:03.606019" 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-04-19T18:04:03.606144" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:03.606269" 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-04-19T18:04:03.606393" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:03.606514" elapsed="0.000020"/>
</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-04-19T18:04:03.606640" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:03.605329" elapsed="0.001362"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.607150" 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-04-19T18:04:03.606826" elapsed="0.000378"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.607562" 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-04-19T18:04:03.607327" elapsed="0.000282"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.607954" 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-04-19T18:04:03.607738" elapsed="0.000258"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.608334" 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-04-19T18:04:03.608114" elapsed="0.000263"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.608664" 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-04-19T18:04:03.608477" elapsed="0.000223"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.608980" 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-04-19T18:04:03.608799" elapsed="0.000215"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.609310" 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-04-19T18:04:03.609114" elapsed="0.000231"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.609638" 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-04-19T18:04:03.609443" elapsed="0.000231"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.609972" 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-04-19T18:04:03.609772" elapsed="0.000236"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:03.606718" elapsed="0.003322"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:03.604139" elapsed="0.005921"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.610317" 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-04-19T18:04:03.610152" elapsed="0.000209"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:03.610766" 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-04-19T18:04:03.610463" elapsed="0.000495"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:03.603568" elapsed="0.007461"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.611222" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:03.611137" elapsed="0.000124"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:03.599016" elapsed="0.012294"/>
</kw>
<test id="s1-s1-s2-t1" name="获取应用分享信息" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:03.614021" 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-04-19T18:04:03.613359" elapsed="0.000690"/>
</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-04-19T18:04:03.614726" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:03.614206" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:03.614185" elapsed="0.000620"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:03.614841" elapsed="0.000049"/>
</return>
<msg time="2026-04-19T18:04:03.615058" 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-04-19T18:04:03.612577" elapsed="0.002505"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:04.544919" 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-04-19T18:04:04.545312" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/app/public/app/share/info 
 status=200, reason=OK 
 headers={'Date': 'Sun, 19 Apr 2026 10:04: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': '141.11.146.71', 'X-Trace-ID': 'beb27202e99c8b871fc103cc8c434d75', 'X-Transparent': '00-beb27202e99c8b871fc103cc8c434d75-1e64705109dad61a-01', 'X-Upstream-Addr': '10.9.149.153:8080', 'X-Upstream-Header-Time': '0.014', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': '9eeb153eaf1204f9-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":1776593044393} 
 </msg>
<msg time="2026-04-19T18:04:04.545534" 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-04-19T18:04:04.545954" 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-04-19T18:04:03.615884" elapsed="0.930137"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:04.546223" elapsed="0.000124"/>
</return>
<msg time="2026-04-19T18:04:04.546662" 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-04-19T18:04:03.615224" elapsed="0.931480"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.548582" 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-04-19T18:04:04.547729" elapsed="0.000944"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.549785" 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-04-19T18:04:04.548836" elapsed="0.000986"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.550156" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:04.549986" elapsed="0.000221"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:04.547111" elapsed="0.003167"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.552100" level="INFO">${json_data} = {'code': 0, 'data': {'path': '/account/register', 'host': 'https://www.bitradex-test.com'}, 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1776593044393}</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-04-19T18:04:04.551205" elapsed="0.000929"/>
</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-04-19T18:04:04.552265" elapsed="0.000215"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.552724" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:04.552596" elapsed="0.000171"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-04-19T18:04:04.550534" elapsed="0.002292"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.554082" level="INFO">${json_data} = {'code': 0, 'data': {'path': '/account/register', 'host': 'https://www.bitradex-test.com'}, 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1776593044393}</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-04-19T18:04:04.553302" elapsed="0.000820"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.554901" level="INFO">${json_str} = {
  "code": 0,
  "data": {
    "path": "/account/register",
    "host": "https://www.bitradex-test.com"
  },
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1776593044393
}</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-04-19T18:04:04.554278" elapsed="0.000785"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.555516" level="INFO">{
  "code": 0,
  "data": {
    "path": "/account/register",
    "host": "https://www.bitradex-test.com"
  },
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1776593044393
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:04.555245" elapsed="0.000395"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-04-19T18:04:04.553011" elapsed="0.002718"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:04.556638" 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-04-19T18:04:04.555904" elapsed="0.000766"/>
</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-04-19T18:04:04.556829" elapsed="0.000296"/>
</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-04-19T18:04:04.558103" elapsed="0.000789"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.559204" 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-04-19T18:04:04.559040" elapsed="0.000218"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-04-19T18:04:04.559588" 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-04-19T18:04:04.559392" elapsed="0.000225"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.559897" level="INFO">Length is 2.</msg>
<msg time="2026-04-19T18:04:04.559980" 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-04-19T18:04:04.559761" elapsed="0.000249"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.560284" level="INFO">分享信息数据包含 2 个字段</msg>
<arg>分享信息数据包含 ${count} 个字段</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:04.560144" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:04.560948" 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-04-19T18:04:04.560659" elapsed="0.000449">Dictionary does not contain key 'title'.</status>
</kw>
<msg time="2026-04-19T18:04:04.561218" 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-04-19T18:04:04.560480" elapsed="0.000765"/>
</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-04-19T18:04:04.561404" elapsed="0.000136"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:04.562028" 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-04-19T18:04:04.561839" elapsed="0.000255">Dictionary does not contain key 'content'.</status>
</kw>
<msg time="2026-04-19T18:04:04.562199" 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-04-19T18:04:04.561679" elapsed="0.000548"/>
</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-04-19T18:04:04.562360" elapsed="0.000110"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:04.563058" 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-04-19T18:04:04.562899" elapsed="0.000216">Dictionary does not contain key 'url'.</status>
</kw>
<msg time="2026-04-19T18:04:04.563202" 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-04-19T18:04:04.562590" elapsed="0.000636"/>
</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-04-19T18:04:04.563350" elapsed="0.000108"/>
</kw>
<arg>${data}</arg>
<doc>验证应用分享信息的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:04.557756" elapsed="0.005771"/>
</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-04-19T18:04:04.557292" elapsed="0.006285"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.564657" 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-04-19T18:04:04.564134" elapsed="0.000550"/>
</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-04-19T18:04:04.564965" elapsed="0.000519"/>
</kw>
<msg time="2026-04-19T18:04:04.565573" 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-04-19T18:04:04.564803" elapsed="0.000795"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.565946" 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-04-19T18:04:04.565789" elapsed="0.000183"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.566269" 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-04-19T18:04:04.566092" elapsed="0.000200"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.566548" 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-04-19T18:04:04.566396" elapsed="0.000174"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.567355" 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-04-19T18:04:04.566673" elapsed="0.000711"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.567675" 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-04-19T18:04:04.567491" elapsed="0.000207"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.567919" 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-04-19T18:04:04.567805" elapsed="0.000153"/>
</kw>
<arg>获取应用分享信息</arg>
<arg>/v1/app/public/app/share/info</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-04-19T18:04:04.563802" elapsed="0.004204"/>
</kw>
<doc>验证应用分享信息接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-04-19T18:04:03.611384" elapsed="0.956799"/>
</test>
<doc>应用分享信息接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:03.593825" elapsed="0.974802"/>
</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-04-19T18:04:04.574074" 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-04-19T18:04:04.573814" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.574724" 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-04-19T18:04:04.574538" elapsed="0.000244"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:04.574258" elapsed="0.000565"/>
</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-04-19T18:04:04.574974" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:04.574852" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:04.574226" elapsed="0.000828"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.576085" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:04.575942" elapsed="0.000195"/>
</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-04-19T18:04:04.576408" 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-04-19T18:04:04.576545" 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-04-19T18:04:04.576679" 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-04-19T18:04:04.576812" 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-04-19T18:04:04.576946" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:04.576215" elapsed="0.000786"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:04.577205" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:04.577334" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:04.577459" 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-04-19T18:04:04.577590" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:04.577712" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:04.577836" elapsed="0.000072"/>
</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-04-19T18:04:04.578019" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:04.578127" 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-04-19T18:04:04.578229" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:04.577026" elapsed="0.001246"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.578598" 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-04-19T18:04:04.578383" elapsed="0.000256"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.578932" 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-04-19T18:04:04.578744" elapsed="0.000225"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.579256" 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-04-19T18:04:04.579074" elapsed="0.000219"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.579570" 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-04-19T18:04:04.579393" elapsed="0.000218"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.579900" 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-04-19T18:04:04.579713" elapsed="0.000222"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.580221" 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-04-19T18:04:04.580036" elapsed="0.000221"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.580548" 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-04-19T18:04:04.580354" elapsed="0.000230"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.580885" 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-04-19T18:04:04.580690" elapsed="0.000230"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.581214" 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-04-19T18:04:04.581019" elapsed="0.000231"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:04.578293" elapsed="0.002988"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:04.576195" elapsed="0.005105"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.581532" 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-04-19T18:04:04.581387" elapsed="0.000188"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:04.581929" 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-04-19T18:04:04.581673" elapsed="0.000412"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:04.575634" elapsed="0.006512"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.582332" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:04.582249" elapsed="0.000122"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:04.573621" elapsed="0.008796"/>
</kw>
<test id="s1-s1-s3-t1" name="获取应用版本信息" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:04.584959" 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-04-19T18:04:04.584327" elapsed="0.000661"/>
</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-04-19T18:04:04.585610" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:04.585106" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:04.585089" elapsed="0.000600"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:04.585722" elapsed="0.000027"/>
</return>
<msg time="2026-04-19T18:04:04.585923" 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-04-19T18:04:04.583597" elapsed="0.002381"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:05.594124" 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-04-19T18:04:05.594558" 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': 'Sun, 19 Apr 2026 10:04: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/app-info/version', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '210f6f0ad1990fbb06e4a217fac50406', 'X-Transparent': '00-210f6f0ad1990fbb06e4a217fac50406-0d50036f69a7366a-01', 'X-Upstream-Addr': '10.9.149.153:8080', 'X-Upstream-Header-Time': '0.006', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': '9eeb15453b51cb79-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":1776593045423} 
 </msg>
<msg time="2026-04-19T18:04:05.594754" 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-04-19T18:04:05.595241" 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-04-19T18:04:04.586693" elapsed="1.008612"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:05.595568" elapsed="0.000178"/>
</return>
<msg time="2026-04-19T18:04:05.596187" 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-04-19T18:04:04.586100" elapsed="1.010145"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.599053" 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-04-19T18:04:05.597818" elapsed="0.001381"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.600552" 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-04-19T18:04:05.599490" elapsed="0.001116"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.601658" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:05.600852" elapsed="0.000904"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:05.596912" elapsed="0.004972"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.603948" 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-04-19T18:04:05.602908" elapsed="0.001091"/>
</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-04-19T18:04:05.604190" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.604858" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:05.604666" elapsed="0.000259"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-04-19T18:04:05.602252" elapsed="0.002761"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.606560" 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-04-19T18:04:05.605723" elapsed="0.000883"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.607516" 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-04-19T18:04:05.606791" elapsed="0.000762"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.607901" 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": 1776593045423
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:05.607695" elapsed="0.000312"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-04-19T18:04:05.605256" elapsed="0.002891"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.609387" 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-04-19T18:04:05.608776" elapsed="0.000646"/>
</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-04-19T18:04:05.609783" elapsed="0.000603"/>
</kw>
<msg time="2026-04-19T18:04:05.610496" 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-04-19T18:04:05.609586" elapsed="0.000940"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.610872" 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-04-19T18:04:05.610687" elapsed="0.000217"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.611284" 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-04-19T18:04:05.611046" elapsed="0.000268"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.611661" 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-04-19T18:04:05.611459" elapsed="0.000234"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.612114" 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-04-19T18:04:05.611820" elapsed="0.000326"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.612468" 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-04-19T18:04:05.612263" elapsed="0.000237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.612736" 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-04-19T18:04:05.612614" elapsed="0.000172"/>
</kw>
<arg>获取应用版本信息</arg>
<arg>/v1/app/public/app-info/version?client=ios-test-flight&amp;build=7034</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-04-19T18:04:05.608377" elapsed="0.004468"/>
</kw>
<doc>验证应用版本信息接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-04-19T18:04:04.582471" elapsed="1.030558"/>
</test>
<doc>应用版本信息接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:04.569760" elapsed="1.043795"/>
</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-04-19T18:04:05.620599" 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-04-19T18:04:05.620395" elapsed="0.000233"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.621078" 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-04-19T18:04:05.620958" elapsed="0.000164"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:05.620742" elapsed="0.000414"/>
</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-04-19T18:04:05.621293" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:05.621200" elapsed="0.000143"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:05.620706" elapsed="0.000659"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.622018" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:05.621913" 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-04-19T18:04:05.622275" 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-04-19T18:04:05.622395" 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-04-19T18:04:05.622499" 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-04-19T18:04:05.622608" 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-04-19T18:04:05.622713" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:05.622119" elapsed="0.000645"/>
</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-04-19T18:04:05.622917" elapsed="0.000068"/>
</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-04-19T18:04:05.623078" 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-04-19T18:04:05.623180" 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-04-19T18:04:05.623284" 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-04-19T18:04:05.623391" 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-04-19T18:04:05.623494" 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-04-19T18:04:05.623595" 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-04-19T18:04:05.623697" 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-04-19T18:04:05.623801" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:05.622787" elapsed="0.001062"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.624181" 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-04-19T18:04:05.623955" elapsed="0.000262"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.624497" 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-04-19T18:04:05.624312" elapsed="0.000220"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.624818" 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-04-19T18:04:05.624628" elapsed="0.000224"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.625126" 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-04-19T18:04:05.624942" elapsed="0.000218"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.625431" 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-04-19T18:04:05.625252" elapsed="0.000213"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.625738" 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-04-19T18:04:05.625558" elapsed="0.000215"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.626071" 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-04-19T18:04:05.625864" elapsed="0.000241"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.626394" 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-04-19T18:04:05.626204" elapsed="0.000223"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.626724" 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-04-19T18:04:05.626520" elapsed="0.000244"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:05.623872" elapsed="0.002930"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:05.622105" elapsed="0.004716"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.627045" 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-04-19T18:04:05.626908" elapsed="0.000176"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:05.627512" 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-04-19T18:04:05.627189" elapsed="0.000585"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:05.621680" elapsed="0.006151"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.627985" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:05.627917" elapsed="0.000101"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:05.620136" elapsed="0.007926"/>
</kw>
<test id="s1-s1-s4-t1" name="获取Banner列表" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.629065" 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-04-19T18:04:05.628873" elapsed="0.000213"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:05.630507" 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-04-19T18:04:05.629960" elapsed="0.000569"/>
</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-04-19T18:04:05.631124" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:05.630664" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:05.630648" elapsed="0.000549"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:05.631232" elapsed="0.000055"/>
</return>
<msg time="2026-04-19T18:04:05.631443" 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-04-19T18:04:05.629278" elapsed="0.002201"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:06.640424" 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-04-19T18:04:06.640861" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/app/public/banner/listByApp?type=2 
 status=200, reason=OK 
 headers={'Date': 'Sun, 19 Apr 2026 10:04: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/banner/listByApp', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': 'aebc829cc22f77371e5f40bc86602eca', 'X-Transparent': '00-aebc829cc22f77371e5f40bc86602eca-dfa1eba1b10f683e-01', 'X-Upstream-Addr': '10.9.149.153:8080', 'X-Upstream-Header-Time': '0.006', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': '9eeb154bb88f8491-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":[],"msg":"Success.","msgInfo":{"template":"Success."},"ts":1776593046484} 
 </msg>
<msg time="2026-04-19T18:04:06.641047" 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-04-19T18:04:06.641495" 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-04-19T18:04:05.631575" elapsed="1.009987"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.643635" 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-04-19T18:04:06.642169" elapsed="0.001633"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.645312" level="INFO">${resp_json} = {'code': 0, 'data': [], 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1776593046484}</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-04-19T18:04:06.644136" elapsed="0.001222"/>
</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-04-19T18:04:06.645554" elapsed="0.000267"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.646754" level="INFO">${json_str} = {
  "code": 0,
  "data": [],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1776593046484
}</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-04-19T18:04:06.646024" elapsed="0.000778"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.647286" level="INFO">{
  "code": 0,
  "data": [],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1776593046484
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:06.647005" elapsed="0.000416"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:06.648478" 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-04-19T18:04:06.647611" elapsed="0.000907"/>
</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-04-19T18:04:06.648712" elapsed="0.000397"/>
</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-04-19T18:04:06.650313" elapsed="0.000259"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.650882" level="INFO">Length is 0.</msg>
<msg time="2026-04-19T18:04:06.650971" 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-04-19T18:04:06.650731" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.651306" 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-04-19T18:04:06.651139" elapsed="0.000218"/>
</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-04-19T18:04:06.651544" elapsed="0.000159"/>
</kw>
<arg>${data}</arg>
<doc>验证Banner列表的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:06.649836" elapsed="0.001960"/>
</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-04-19T18:04:06.649288" elapsed="0.002571"/>
</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-04-19T18:04:06.652002" elapsed="0.000193"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.652964" 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-04-19T18:04:06.652335" elapsed="0.000685"/>
</kw>
<doc>验证Banner列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-04-19T18:04:05.628127" elapsed="1.025120"/>
</test>
<doc>Banner列表接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:05.614816" elapsed="1.038925"/>
</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-04-19T18:04:06.659902" 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-04-19T18:04:06.659698" elapsed="0.000231"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.660383" 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-04-19T18:04:06.660264" elapsed="0.000162"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:06.660048" 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-04-19T18:04:06.660597" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:06.660507" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:06.660005" elapsed="0.000660"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.661306" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:06.661212" elapsed="0.000129"/>
</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-04-19T18:04:06.661535" 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-04-19T18:04:06.661637" 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-04-19T18:04:06.661731" 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-04-19T18:04:06.661823" 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-04-19T18:04:06.661916" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:06.661395" elapsed="0.000576"/>
</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-04-19T18:04:06.662110" 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-04-19T18:04:06.662203" 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-04-19T18:04:06.662303" 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-04-19T18:04:06.662393" 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-04-19T18:04:06.662487" 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-04-19T18:04:06.662583" 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-04-19T18:04:06.662684" 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-04-19T18:04:06.662774" elapsed="0.000020"/>
</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-04-19T18:04:06.662876" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:06.661993" elapsed="0.000920"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.663205" 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-04-19T18:04:06.663002" elapsed="0.000243"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.663527" 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-04-19T18:04:06.663348" elapsed="0.000216"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.663889" 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-04-19T18:04:06.663707" elapsed="0.000213"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.664165" 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-04-19T18:04:06.664002" elapsed="0.000192"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.664439" 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-04-19T18:04:06.664279" elapsed="0.000189"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.664712" 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-04-19T18:04:06.664553" elapsed="0.000188"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.665017" 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-04-19T18:04:06.664825" elapsed="0.000221"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.665683" 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-04-19T18:04:06.665317" elapsed="0.000425"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.666137" 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-04-19T18:04:06.665891" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:06.662932" elapsed="0.003292"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:06.661382" elapsed="0.004873"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.666588" 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-04-19T18:04:06.666380" elapsed="0.000262"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:06.667100" 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-04-19T18:04:06.666767" elapsed="0.000532"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:06.660983" elapsed="0.006400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.667621" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:06.667509" elapsed="0.000160"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:06.659268" elapsed="0.008462"/>
</kw>
<test id="s1-s1-s5-t1" name="申请验证码" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.669100" 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-04-19T18:04:06.668868" elapsed="0.000257"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:06.670746" 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-04-19T18:04:06.670119" elapsed="0.000656"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:06.671438" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:06.670904" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:06.670884" elapsed="0.000637"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:06.671555" elapsed="0.000039"/>
</return>
<msg time="2026-04-19T18:04:06.671769" 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-04-19T18:04:06.669344" elapsed="0.002451"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:07.690501" 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-04-19T18:04:07.690864" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/app/public/captcha/apply?type=2 
 status=200, reason=OK 
 headers={'Date': 'Sun, 19 Apr 2026 10:04: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', 'api-method': 'GET', 'api-path': '/public/captcha/apply', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': 'a42d9ee8b833782720e28982f6db223a', 'X-Transparent': '00-a42d9ee8b833782720e28982f6db223a-cafef7de8eed04b5-01', 'X-Upstream-Addr': '10.9.149.153:8080', 'X-Upstream-Header-Time': '0.006', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': '9eeb15524ec5dd4b-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":{"code":"","sdkKey":"b7ec2ff3d4562f9c471212339ab1d94d","enabled":true},"msg":"Success.","msgInfo":{"template":"Success."},"ts":1776593047534} 
 </msg>
<msg time="2026-04-19T18:04:07.691161" 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-04-19T18:04:07.691516" 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-04-19T18:04:06.672343" elapsed="1.019235"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:07.691796" elapsed="0.000123"/>
</return>
<msg time="2026-04-19T18:04:07.692274" 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-04-19T18:04:06.671943" elapsed="1.020386"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.694325" 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-04-19T18:04:07.693693" elapsed="0.000704"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.694975" 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-04-19T18:04:07.694522" elapsed="0.000511"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.695540" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:07.695269" elapsed="0.000359"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:07.692877" elapsed="0.002867"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.697846" level="INFO">${json_data} = {'code': 0, 'data': {'code': '', 'sdkKey': 'b7ec2ff3d4562f9c471212339ab1d94d', 'enabled': True}, 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1776593047534}</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-04-19T18:04:07.696730" elapsed="0.001178"/>
</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-04-19T18:04:07.698051" elapsed="0.000213"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.698541" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:07.698395" elapsed="0.000195"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-04-19T18:04:07.696085" elapsed="0.002567"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.699899" level="INFO">${json_data} = {'code': 0, 'data': {'code': '', 'sdkKey': 'b7ec2ff3d4562f9c471212339ab1d94d', 'enabled': True}, 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1776593047534}</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-04-19T18:04:07.699119" elapsed="0.000823"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.700780" level="INFO">${json_str} = {
  "code": 0,
  "data": {
    "code": "",
    "sdkKey": "b7ec2ff3d4562f9c471212339ab1d94d",
    "enabled": true
  },
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 177659...</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-04-19T18:04:07.700115" elapsed="0.000712"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.701262" level="INFO">{
  "code": 0,
  "data": {
    "code": "",
    "sdkKey": "b7ec2ff3d4562f9c471212339ab1d94d",
    "enabled": true
  },
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1776593047534
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:07.701008" elapsed="0.000397"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-04-19T18:04:07.698829" elapsed="0.002665"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.702717" 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-04-19T18:04:07.702200" elapsed="0.000544"/>
</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-04-19T18:04:07.703138" elapsed="0.000595"/>
</kw>
<msg time="2026-04-19T18:04:07.703840" 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-04-19T18:04:07.702894" elapsed="0.000974"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.704191" 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-04-19T18:04:07.704016" elapsed="0.000205"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.704612" 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-04-19T18:04:07.704368" elapsed="0.000273"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.705069" 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-04-19T18:04:07.704869" elapsed="0.000229"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.705551" 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-04-19T18:04:07.705230" elapsed="0.000354"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.705943" 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-04-19T18:04:07.705720" elapsed="0.000250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.706203" 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-04-19T18:04:07.706085" elapsed="0.000165"/>
</kw>
<arg>请求验证码</arg>
<arg>/v1/app/public/captcha/apply</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-04-19T18:04:07.701767" elapsed="0.004551"/>
</kw>
<doc>验证验证码请求接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-04-19T18:04:06.667802" elapsed="1.038715"/>
</test>
<doc>验证码申请接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:06.654833" elapsed="1.052164"/>
</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-04-19T18:04:07.713278" 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-04-19T18:04:07.713085" elapsed="0.000220"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.713732" 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-04-19T18:04:07.713617" elapsed="0.000156"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:07.713413" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:07.713931" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:07.713842" elapsed="0.000134"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:07.713381" elapsed="0.000625"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.714656" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:07.714550" elapsed="0.000148"/>
</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-04-19T18:04:07.714907" 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-04-19T18:04:07.715017" 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-04-19T18:04:07.715113" 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-04-19T18:04:07.715207" 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-04-19T18:04:07.715315" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:07.714759" elapsed="0.000598"/>
</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-04-19T18:04:07.715494" 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-04-19T18:04:07.715586" 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-04-19T18:04:07.715677" 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-04-19T18:04:07.715780" 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-04-19T18:04:07.715870" 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-04-19T18:04:07.715966" 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-04-19T18:04:07.716065" 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-04-19T18:04:07.716152" 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-04-19T18:04:07.716273" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:07.715377" elapsed="0.000936"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.716610" 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-04-19T18:04:07.716403" elapsed="0.000238"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.716891" 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-04-19T18:04:07.716726" elapsed="0.000196"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.717173" 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-04-19T18:04:07.717006" elapsed="0.000197"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.717444" 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-04-19T18:04:07.717285" elapsed="0.000189"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.717723" 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-04-19T18:04:07.717560" elapsed="0.000193"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.718020" 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-04-19T18:04:07.717837" elapsed="0.000212"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.718324" 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-04-19T18:04:07.718136" elapsed="0.000217"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.718626" 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-04-19T18:04:07.718435" elapsed="0.000220"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.719046" 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-04-19T18:04:07.718738" elapsed="0.000413"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:07.716332" elapsed="0.002882"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:07.714743" elapsed="0.004504"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.719696" 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-04-19T18:04:07.719436" elapsed="0.000320"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:07.720223" 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-04-19T18:04:07.719889" elapsed="0.000541"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:07.714316" elapsed="0.006198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.720752" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:07.720643" elapsed="0.000156"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:07.712849" elapsed="0.008011"/>
</kw>
<test id="s1-s1-s6-t1" name="获取开屏广告列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:07.724069" 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-04-19T18:04:07.723396" elapsed="0.000702"/>
</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-04-19T18:04:07.724766" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:07.724231" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:07.724207" elapsed="0.000641"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:07.724882" elapsed="0.000031"/>
</return>
<msg time="2026-04-19T18:04:07.725075" 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-04-19T18:04:07.722366" elapsed="0.002734"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:08.401141" 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-04-19T18:04:08.401697" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/app/public/open-screen/list 
 status=200, reason=OK 
 headers={'Date': 'Sun, 19 Apr 2026 10:04:08 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'api-method': 'GET', 'api-path': '/public/open-screen/list', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '3e4269305d479bf85dd8672b8b9ab483', 'X-Transparent': '00-3e4269305d479bf85dd8672b8b9ab483-b6cb7e427e070036-01', 'X-Upstream-Addr': '10.9.149.153:8080', 'X-Upstream-Header-Time': '0.006', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': '9eeb1557fee0786c-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":{},"msg":"Success.","msgInfo":{"template":"Success."},"ts":1776593048366} 
 </msg>
<msg time="2026-04-19T18:04:08.401871" 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-04-19T18:04:08.402257" 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-04-19T18:04:07.725892" elapsed="0.676433"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:08.402596" elapsed="0.000167"/>
</return>
<msg time="2026-04-19T18:04:08.403266" 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-04-19T18:04:07.725239" elapsed="0.678091"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.406249" 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-04-19T18:04:08.404979" elapsed="0.001418"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.407716" 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-04-19T18:04:08.406663" elapsed="0.001108"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.408307" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:08.408017" elapsed="0.000385"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:08.404015" elapsed="0.004511"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.410630" level="INFO">${json_data} = {'code': 0, 'data': {}, 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1776593048366}</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-04-19T18:04:08.409496" elapsed="0.001196"/>
</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-04-19T18:04:08.410948" elapsed="0.000387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.411687" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:08.411498" elapsed="0.000259"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-04-19T18:04:08.408866" elapsed="0.002978"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.413338" level="INFO">${json_data} = {'code': 0, 'data': {}, 'msg': 'Success.', 'msgInfo': {'template': 'Success.'}, 'ts': 1776593048366}</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-04-19T18:04:08.412514" elapsed="0.000867"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.414279" level="INFO">${json_str} = {
  "code": 0,
  "data": {},
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1776593048366
}</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-04-19T18:04:08.413567" elapsed="0.000758"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.414759" level="INFO">{
  "code": 0,
  "data": {},
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1776593048366
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:08.414502" elapsed="0.000400"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-04-19T18:04:08.412099" elapsed="0.002895"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.416272" 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-04-19T18:04:08.415691" elapsed="0.000612"/>
</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-04-19T18:04:08.416682" elapsed="0.000926"/>
</kw>
<msg time="2026-04-19T18:04:08.417728" 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-04-19T18:04:08.416472" elapsed="0.001286"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.418122" 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-04-19T18:04:08.417931" elapsed="0.000305"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.418629" 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-04-19T18:04:08.418381" elapsed="0.000277"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.418991" 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-04-19T18:04:08.418796" elapsed="0.000224"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.419455" 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-04-19T18:04:08.419155" elapsed="0.000330"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.419802" 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-04-19T18:04:08.419600" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.420061" 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-04-19T18:04:08.419944" elapsed="0.000160"/>
</kw>
<arg>获取开屏广告列表</arg>
<arg>/v1/app/public/open-screen/list</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-04-19T18:04:08.415290" elapsed="0.004877"/>
</kw>
<doc>验证开屏广告列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-04-19T18:04:07.720933" elapsed="0.699458"/>
</test>
<doc>开屏广告列表接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:07.708165" elapsed="0.712733"/>
</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-04-19T18:04:08.427301" 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-04-19T18:04:08.427112" elapsed="0.000216"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.427733" 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-04-19T18:04:08.427620" elapsed="0.000154"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:08.427428" elapsed="0.000376"/>
</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-04-19T18:04:08.427921" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:08.427831" elapsed="0.000136"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:08.427400" elapsed="0.000587"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.428762" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:08.428641" elapsed="0.000166"/>
</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-04-19T18:04:08.429048" 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-04-19T18:04:08.429155" 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-04-19T18:04:08.429254" 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-04-19T18:04:08.429355" 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-04-19T18:04:08.429457" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:08.428874" elapsed="0.000624"/>
</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-04-19T18:04:08.431868" elapsed="0.000047"/>
</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-04-19T18:04:08.432077" 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-04-19T18:04:08.432228" 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-04-19T18:04:08.432358" 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-04-19T18:04:08.432486" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:08.432611" 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-04-19T18:04:08.432734" elapsed="0.000067"/>
</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-04-19T18:04:08.432933" elapsed="0.000022"/>
</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-04-19T18:04:08.433071" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:08.429521" elapsed="0.003606"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.433618" 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-04-19T18:04:08.433275" elapsed="0.000402"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.434041" 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-04-19T18:04:08.433807" elapsed="0.000281"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.434434" 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-04-19T18:04:08.434212" elapsed="0.000268"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.434834" 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-04-19T18:04:08.434605" elapsed="0.000275"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.435193" 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-04-19T18:04:08.435000" elapsed="0.000230"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.435524" 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-04-19T18:04:08.435335" elapsed="0.000229"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.435856" 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-04-19T18:04:08.435664" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.436193" 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-04-19T18:04:08.435992" elapsed="0.000236"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.436527" 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-04-19T18:04:08.436335" elapsed="0.000230"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:08.433161" elapsed="0.003435"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:08.428855" elapsed="0.007762"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.436888" 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-04-19T18:04:08.436718" elapsed="0.000214"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:08.437336" 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-04-19T18:04:08.437034" elapsed="0.000504"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:08.428351" elapsed="0.009261"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.437804" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:08.437715" elapsed="0.000130"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:08.426824" elapsed="0.011070"/>
</kw>
<test id="s1-s1-s7-t1" name="获取开屏广告语言列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:08.440725" 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-04-19T18:04:08.440076" elapsed="0.000677"/>
</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-04-19T18:04:08.441420" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:08.440877" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:08.440854" elapsed="0.000650"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:08.441538" elapsed="0.000039"/>
</return>
<msg time="2026-04-19T18:04:08.441749" 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-04-19T18:04:08.439289" elapsed="0.002484"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:09.062428" 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-04-19T18:04:09.062846" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/app/public/open-screen/list/lang 
 status=200, reason=OK 
 headers={'Date': 'Sun, 19 Apr 2026 10:04:09 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'api-method': 'GET', 'api-path': '/public/open-screen/list/lang', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': 'bc56b5bb58291433b5365220e6048c55', 'X-Transparent': '00-bc56b5bb58291433b5365220e6048c55-322b2019c8ea72f9-01', 'X-Upstream-Addr': '10.9.149.153:8080', 'X-Upstream-Header-Time': '0.007', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': '9eeb155c1ab906a7-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":999,"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":1776593049023} 
 </msg>
<msg time="2026-04-19T18:04:09.063111" 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-04-19T18:04:09.063558" 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-04-19T18:04:08.442581" elapsed="0.621043"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:09.063877" elapsed="0.000128"/>
</return>
<msg time="2026-04-19T18:04:09.064408" 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-04-19T18:04:08.441913" elapsed="0.622562"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.067277" 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-04-19T18:04:09.066000" elapsed="0.001436"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.068836" 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-04-19T18:04:09.067743" elapsed="0.001150"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.069433" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:09.069143" elapsed="0.000392"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:09.065101" elapsed="0.004558"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.071692" 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-04-19T18:04:09.070698" elapsed="0.001041"/>
</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-04-19T18:04:09.071933" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.072615" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:09.072415" elapsed="0.000269"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-04-19T18:04:09.070024" elapsed="0.002748"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.074342" 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-04-19T18:04:09.073444" elapsed="0.000941"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.075781" 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-04-19T18:04:09.074568" elapsed="0.001250"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.076186" 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": 999,
      "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": 1776593049023
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:09.075967" elapsed="0.000390"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-04-19T18:04:09.073012" elapsed="0.003419"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:09.077284" 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-04-19T18:04:09.076580" elapsed="0.000739"/>
</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-04-19T18:04:09.077483" elapsed="0.000328"/>
</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-04-19T18:04:09.078702" elapsed="0.000211"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.079171" level="INFO">Length is 3.</msg>
<msg time="2026-04-19T18:04:09.079243" 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-04-19T18:04:09.079045" elapsed="0.000223"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.079504" level="INFO">语言列表包含 3 个语言项</msg>
<arg>语言列表包含 ${length} 个语言项</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:09.079382" elapsed="0.000164"/>
</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-04-19T18:04:09.080664" elapsed="0.000229"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.081153" 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-04-19T18:04:09.081013" elapsed="0.000190"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:09.081748" 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-04-19T18:04:09.081488" elapsed="0.000392">Dictionary does not contain key 'code'.</status>
</kw>
<msg time="2026-04-19T18:04:09.081982" 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-04-19T18:04:09.081335" elapsed="0.000672"/>
</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-04-19T18:04:09.082140" elapsed="0.000118"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:09.082684" 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-04-19T18:04:09.082520" elapsed="0.000217">Dictionary does not contain key 'name'.</status>
</kw>
<msg time="2026-04-19T18:04:09.082820" 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-04-19T18:04:09.082385" elapsed="0.000455"/>
</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-04-19T18:04:09.082987" elapsed="0.000098"/>
</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-04-19T18:04:09.083310" elapsed="0.000129"/>
</kw>
<msg time="2026-04-19T18:04:09.083513" 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-04-19T18:04:09.083192" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.084247" level="INFO">语言标识: cn</msg>
<arg>语言标识: ${lang_item['lang']}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:09.083789" elapsed="0.000501"/>
</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-04-19T18:04:09.083643" elapsed="0.000690"/>
</kw>
<arg>${lang_list[0]}</arg>
<doc>验证单个语言项的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:09.079940" elapsed="0.004447"/>
</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-04-19T18:04:09.079660" elapsed="0.004770"/>
</kw>
<arg>${data}</arg>
<doc>验证语言列表的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:09.078392" elapsed="0.006094"/>
</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-04-19T18:04:09.077996" elapsed="0.006530"/>
</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-04-19T18:04:09.084632" elapsed="0.000154"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.085727" 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-04-19T18:04:09.085269" elapsed="0.000481"/>
</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-04-19T18:04:09.085988" elapsed="0.000471"/>
</kw>
<msg time="2026-04-19T18:04:09.086527" 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-04-19T18:04:09.085853" elapsed="0.000692"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.086780" 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-04-19T18:04:09.086651" elapsed="0.000148"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.087052" 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-04-19T18:04:09.086897" elapsed="0.000174"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.087464" 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-04-19T18:04:09.087169" elapsed="0.000327"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.087809" 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-04-19T18:04:09.087590" elapsed="0.000243"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.088095" 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-04-19T18:04:09.087925" elapsed="0.000193"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.088302" 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-04-19T18:04:09.088210" elapsed="0.000125"/>
</kw>
<arg>获取开屏广告语言列表</arg>
<arg>/v1/app/public/open-screen/list/lang</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-04-19T18:04:09.084985" elapsed="0.003396"/>
</kw>
<doc>验证开屏广告语言列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-04-19T18:04:08.437958" elapsed="0.650592"/>
</test>
<doc>开屏广告语言列表接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:08.422134" elapsed="0.666814"/>
</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-04-19T18:04:09.094573" 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-04-19T18:04:09.094378" elapsed="0.000225"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.095010" 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-04-19T18:04:09.094884" elapsed="0.000203"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:09.094685" elapsed="0.000435"/>
</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-04-19T18:04:09.095234" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:09.095143" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:09.094663" elapsed="0.000637"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.095913" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:09.095798" elapsed="0.000156"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:09.096164" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:09.096286" 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-04-19T18:04:09.096397" 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-04-19T18:04:09.096502" 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-04-19T18:04:09.096605" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:09.096014" elapsed="0.000638"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:09.096816" 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-04-19T18:04:09.096924" 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-04-19T18:04:09.097032" 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-04-19T18:04:09.097141" 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-04-19T18:04:09.097245" 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-04-19T18:04:09.097344" 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-04-19T18:04:09.097447" 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-04-19T18:04:09.097545" 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-04-19T18:04:09.097640" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:09.096672" elapsed="0.001010"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.098122" 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-04-19T18:04:09.097783" elapsed="0.000377"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.098451" 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-04-19T18:04:09.098267" elapsed="0.000221"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.098770" 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-04-19T18:04:09.098590" elapsed="0.000214"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.099084" 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-04-19T18:04:09.098901" elapsed="0.000220"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.099402" 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-04-19T18:04:09.099219" elapsed="0.000219"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.099732" 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-04-19T18:04:09.099539" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.100069" 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-04-19T18:04:09.099868" elapsed="0.000235"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.100400" 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-04-19T18:04:09.100202" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.100724" 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-04-19T18:04:09.100534" elapsed="0.000224"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:09.097702" elapsed="0.003106"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:09.095998" elapsed="0.004831"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.101058" 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-04-19T18:04:09.100915" elapsed="0.000183"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:09.101472" 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-04-19T18:04:09.101208" elapsed="0.000421"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:09.095560" elapsed="0.006129"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.101865" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:09.101785" elapsed="0.000119"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:09.094098" elapsed="0.007854"/>
</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-04-19T18:04:09.103975" 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-04-19T18:04:09.103424" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:09.104511" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:09.104096" elapsed="0.000462"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:09.104082" elapsed="0.000494"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:09.104604" elapsed="0.000026"/>
</return>
<msg time="2026-04-19T18:04:09.104803" 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-04-19T18:04:09.102796" elapsed="0.002031"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:09.105066" 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-04-19T18:04:09.104919" elapsed="0.000168"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:09.997915" 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-04-19T18:04:09.998369" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/app/public/vajra-district/list?version=new 
 status=200, reason=OK 
 headers={'Date': 'Sun, 19 Apr 2026 10:04:09 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'api-method': 'GET', 'api-path': '/public/vajra-district/list', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': 'ab6a7f3e1505d6e8ba29ac9d08900563', 'X-Transparent': '00-ab6a7f3e1505d6e8ba29ac9d08900563-a174d7fc67ecd1d1-01', 'X-Upstream-Addr': '10.9.149.153:8080', 'X-Upstream-Header-Time': '0.020', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': '9eeb1561dd1b0671-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"data":[{"sonList":[{"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":"事件合约en","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"},"name":"事件合约","link":"noahex://app.com/trade/event-contract","id":147,"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","mn":"BXC","ru":"BXC","tw":"BXC","ko":"BXC","pt":"BXC","ms":"BXC","en":"BXC","cn":"BXC","pt_br":"BXC","es":"BXC","vi":"BXC","th":"BXC","ja":"BXC","az":"BXC","id":"BXC"},"name":"BXC","link":"noahex://app.com/token/bxc","id":146,"label":0},{"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":"AI earnru","tw":"AI Trading","ko":"AI 트레이딩","ms":"AI earn ms","en":"AI Trading","cn":"AI智投","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"},"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/d4b39053538348f5b704aed8f0abd17a.png","dayIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/09d17ce5c870480c8d5a8314ecdf823f.png","nameAll":{"kk":"月进斗金","mn":"月进斗金","ru":"月进斗金","tw":"月进斗金","ko":"月进斗金","pt":"月进斗金","ms":"月进斗金","en":"月进斗金","cn":"月进斗金","pt_br":"月进斗金","es":"月进斗金","vi":"月进斗金","th":"月进斗金","ja":"月进斗金","az":"月进斗金","id":"月进斗金"},"name":"月进斗金","link":"https://www.bitradex-test.com/battle/seckill?activityId=6AOFRDZYHWFU","id":144,"label":0},{"isNeedLogin":1,"nightIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/feaa1c2c1c8548558594b9536fdf0008.png","dayIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/5055b73afbf2471d9c1b116ad4874858.png","nameAll":{"kk":"new user","mn":"new user","ru":"new user","tw":"new user","ko":"new user","pt":"new user","ms":"new user","en":"new user","cn":"新手礼包","es":"new user","vi":"new user","th":"new user","ja":"new user","az":"新手礼包","id":"new user"},"name":"新手礼包","link":"/battle/newUser","id":137,"label":0},{"isNeedLogin":1,"nightIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/dbf4252dd1c2490ba021aee1ab2face2.png","dayIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/61c72364d8844c69ad8a9e47f30f58d9.png","nameAll":{"kk":"Team","hi":"Invite Friends","mn":"Team","hk":"Invite Friends","ru":"Invite Friends","tw":"Team","ko":"노드 계획","pt":"Team","ms":"Invite Friends","en":"Team","cn":"节点计划","pt_br":"Team","fr":"Invite Friends","es":"Invite Friends","vi":"kế hoạch nút","th":"Invite Friends","ja":"ノード計画","az":"Team","id":"Invite Friends","pt ":"Team","tr":"Invite Friends"},"name":"节点计划","link":"/activitycenter/home","id":122,"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":"巅峰邀请赛EN","tw":"巅峰邀请赛EN","ko":"巅峰邀请赛EN","pt":"巅峰邀请赛EN","ms":"巅峰邀请赛EN","en":"巅峰邀请赛EN","cn":"巅峰邀请赛CN","pt_br":"巅峰邀请赛EN","fr":"shequn","es":"巅峰邀请赛EN","vi":"巅峰邀请赛EN","th":"巅峰邀请赛EN","ja":"巅峰邀请赛EN","az":"巅峰邀请赛","id":"巅峰邀请赛EN","tr":"shequn"},"name":"巅峰邀请赛CN","link":"https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament/internal","id":145,"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","mn":"redPackage","ru":"redPackage","tw":"redPackage","ko":"redPackage","pt":"redPackage","ms":"redPackage","pt-br":"yingwen","en":"redPackage","cn":"红包","es":"redPackage","vi":"redPackage","th":"redPackage","ja":"redPackage","az":"redPackage","id":"redPackage"},"name":"红包","link":"noahex://app.com/redPackage","id":140,"label":0},{"isNeedLogin":0,"nightIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/63da535f5a18457d99f8ddee0c46d7a4.png","dayIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/4b56027e33f84d9ba79dbd167aa7638b.png","nameAll":{"kk":"Help Center","hi":"Help Center","mn":"Help Center","hk":"Help Center","ru":"Help Center","tw":"Help Center","ko":"Help Center","ms":"Help Center","en":"Help Center","cn":"帮助中心","fr":"Help Center","es":"Help Center","vi":"Help Center","th":"Help Center","ja":"Help Center","az":"Help Center","id":"Help Center","pt ":"Help Center","tr":"Help Center"},"name":"帮助中心","link":"helplook.com","id":130,"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"},"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/82476e9bcd7f42a38e0bf28b44db2de8.png","dayIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/dd9268feca134003a09fafc04a673b0f.png","nameAll":{"kk":"Community","ptbr":"活动中心","hi":"shequn","mn":"Community","hk":"shequn","ru":"shequn","tw":"Community","ko":"커뮤니티","pt":"Community","ms":"shequn","en":"活动中心","cn":"活动中心","fr":"shequn","es":"shequn","vi":"Cộng đồng","th":"shequn","ja":"コミュニティ","az":"活动中心","id":"shequn","tr":"shequn"},"name":"活动中心","link":"/battle/doubleFestival","id":133,"label":0},{"isNeedLogin":1,"nightIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/24cb0b342190474aad36ab5845afa594.png","dayIcon":"https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/12a48720d7a84c3aa8a33e955d503619.png","nameAll":{"kk":"IM 英语跳转","ptbr":"IM 英语跳转","mn":"IM 英语跳转","ru":"IM 英语跳转","tw":"IM 英语跳转","ko":"IM 英语跳转","pt":"IM 英语跳转","ms":"IM 英语跳转","en":"IM 英语跳转","cn":"IM 跳转","es":"IM 英语跳转","vi":"IM 英语跳转","th":"IM 英语跳转","ja":"IM 英语跳转","az":"IM1","id":"IM 英语跳转","pt ":"IM 英语跳转"},"name":"IM 跳转","link":"noahex://app.com/home/message/messageList","id":134,"label":1}]}],"msg":"Success.","msgInfo":{"template":"Success."},"ts":1776593049956} 
 </msg>
<msg time="2026-04-19T18:04:09.998908" 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-04-19T18:04:09.999339" 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-04-19T18:04:09.105560" elapsed="0.893844"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:09.999658" elapsed="0.000159"/>
</return>
<msg time="2026-04-19T18:04:10.000206" 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-04-19T18:04:09.105206" elapsed="0.895053"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.003003" 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-04-19T18:04:10.001744" elapsed="0.001406"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.004482" 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-04-19T18:04:10.003416" elapsed="0.001120"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.004960" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:10.004739" elapsed="0.000289"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:10.000836" elapsed="0.004289"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.007131" level="INFO">${json_data} = {'code': 0, 'data': [{'sonList': [{'isNeedLogin': 1, 'nightIcon': 'https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/cb16dc4c500f452d802d97395a8e9c3...</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-04-19T18:04:10.005879" elapsed="0.001303"/>
</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-04-19T18:04:10.007375" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.008033" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:10.007842" elapsed="0.000258"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-04-19T18:04:10.005402" elapsed="0.002791"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.010186" level="INFO">${json_data} = {'code': 0, 'data': [{'sonList': [{'isNeedLogin': 1, 'nightIcon': 'https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/cb16dc4c500f452d802d97395a8e9c3...</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-04-19T18:04:10.008801" elapsed="0.001428"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.011866" level="INFO">${json_str} = {
  "code": 0,
  "data": [
    {
      "sonList": [
        {
          "isNeedLogin": 1,
          "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-04-19T18:04:10.010386" elapsed="0.001518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.012311" level="INFO">{
  "code": 0,
  "data": [
    {
      "sonList": [
        {
          "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": "事件合约en",
            "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"
          },
          "name": "事件合约",
          "link": "noahex://app.com/trade/event-contract",
          "id": 147,
          "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",
            "mn": "BXC",
            "ru": "BXC",
            "tw": "BXC",
            "ko": "BXC",
            "pt": "BXC",
            "ms": "BXC",
            "en": "BXC",
            "cn": "BXC",
            "pt_br": "BXC",
            "es": "BXC",
            "vi": "BXC",
            "th": "BXC",
            "ja": "BXC",
            "az": "BXC",
            "id": "BXC"
          },
          "name": "BXC",
          "link": "noahex://app.com/token/bxc",
          "id": 146,
          "label": 0
        },
        {
          "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": "AI earnru",
            "tw": "AI Trading",
            "ko": "AI 트레이딩",
            "ms": "AI earn ms",
            "en": "AI Trading",
            "cn": "AI智投",
            "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"
          },
          "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/d4b39053538348f5b704aed8f0abd17a.png",
          "dayIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/09d17ce5c870480c8d5a8314ecdf823f.png",
          "nameAll": {
            "kk": "月进斗金",
            "mn": "月进斗金",
            "ru": "月进斗金",
            "tw": "月进斗金",
            "ko": "月进斗金",
            "pt": "月进斗金",
            "ms": "月进斗金",
            "en": "月进斗金",
            "cn": "月进斗金",
            "pt_br": "月进斗金",
            "es": "月进斗金",
            "vi": "月进斗金",
            "th": "月进斗金",
            "ja": "月进斗金",
            "az": "月进斗金",
            "id": "月进斗金"
          },
          "name": "月进斗金",
          "link": "https://www.bitradex-test.com/battle/seckill?activityId=6AOFRDZYHWFU",
          "id": 144,
          "label": 0
        },
        {
          "isNeedLogin": 1,
          "nightIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/feaa1c2c1c8548558594b9536fdf0008.png",
          "dayIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/5055b73afbf2471d9c1b116ad4874858.png",
          "nameAll": {
            "kk": "new user",
            "mn": "new user",
            "ru": "new user",
            "tw": "new user",
            "ko": "new user",
            "pt": "new user",
            "ms": "new user",
            "en": "new user",
            "cn": "新手礼包",
            "es": "new user",
            "vi": "new user",
            "th": "new user",
            "ja": "new user",
            "az": "新手礼包",
            "id": "new user"
          },
          "name": "新手礼包",
          "link": "/battle/newUser",
          "id": 137,
          "label": 0
        },
        {
          "isNeedLogin": 1,
          "nightIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/dbf4252dd1c2490ba021aee1ab2face2.png",
          "dayIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/61c72364d8844c69ad8a9e47f30f58d9.png",
          "nameAll": {
            "kk": "Team",
            "hi": "Invite Friends",
            "mn": "Team",
            "hk": "Invite Friends",
            "ru": "Invite Friends",
            "tw": "Team",
            "ko": "노드 계획",
            "pt": "Team",
            "ms": "Invite Friends",
            "en": "Team",
            "cn": "节点计划",
            "pt_br": "Team",
            "fr": "Invite Friends",
            "es": "Invite Friends",
            "vi": "kế hoạch nút",
            "th": "Invite Friends",
            "ja": "ノード計画",
            "az": "Team",
            "id": "Invite Friends",
            "pt ": "Team",
            "tr": "Invite Friends"
          },
          "name": "节点计划",
          "link": "/activitycenter/home",
          "id": 122,
          "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": "巅峰邀请赛EN",
            "tw": "巅峰邀请赛EN",
            "ko": "巅峰邀请赛EN",
            "pt": "巅峰邀请赛EN",
            "ms": "巅峰邀请赛EN",
            "en": "巅峰邀请赛EN",
            "cn": "巅峰邀请赛CN",
            "pt_br": "巅峰邀请赛EN",
            "fr": "shequn",
            "es": "巅峰邀请赛EN",
            "vi": "巅峰邀请赛EN",
            "th": "巅峰邀请赛EN",
            "ja": "巅峰邀请赛EN",
            "az": "巅峰邀请赛",
            "id": "巅峰邀请赛EN",
            "tr": "shequn"
          },
          "name": "巅峰邀请赛CN",
          "link": "https://www.bitradex-test.com/zh-CN/battle/peakInvitationalTournament/internal",
          "id": 145,
          "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",
            "mn": "redPackage",
            "ru": "redPackage",
            "tw": "redPackage",
            "ko": "redPackage",
            "pt": "redPackage",
            "ms": "redPackage",
            "pt-br": "yingwen",
            "en": "redPackage",
            "cn": "红包",
            "es": "redPackage",
            "vi": "redPackage",
            "th": "redPackage",
            "ja": "redPackage",
            "az": "redPackage",
            "id": "redPackage"
          },
          "name": "红包",
          "link": "noahex://app.com/redPackage",
          "id": 140,
          "label": 0
        },
        {
          "isNeedLogin": 0,
          "nightIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/63da535f5a18457d99f8ddee0c46d7a4.png",
          "dayIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/4b56027e33f84d9ba79dbd167aa7638b.png",
          "nameAll": {
            "kk": "Help Center",
            "hi": "Help Center",
            "mn": "Help Center",
            "hk": "Help Center",
            "ru": "Help Center",
            "tw": "Help Center",
            "ko": "Help Center",
            "ms": "Help Center",
            "en": "Help Center",
            "cn": "帮助中心",
            "fr": "Help Center",
            "es": "Help Center",
            "vi": "Help Center",
            "th": "Help Center",
            "ja": "Help Center",
            "az": "Help Center",
            "id": "Help Center",
            "pt ": "Help Center",
            "tr": "Help Center"
          },
          "name": "帮助中心",
          "link": "helplook.com",
          "id": 130,
          "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"
          },
          "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/82476e9bcd7f42a38e0bf28b44db2de8.png",
          "dayIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/dd9268feca134003a09fafc04a673b0f.png",
          "nameAll": {
            "kk": "Community",
            "ptbr": "活动中心",
            "hi": "shequn",
            "mn": "Community",
            "hk": "shequn",
            "ru": "shequn",
            "tw": "Community",
            "ko": "커뮤니티",
            "pt": "Community",
            "ms": "shequn",
            "en": "活动中心",
            "cn": "活动中心",
            "fr": "shequn",
            "es": "shequn",
            "vi": "Cộng đồng",
            "th": "shequn",
            "ja": "コミュニティ",
            "az": "活动中心",
            "id": "shequn",
            "tr": "shequn"
          },
          "name": "活动中心",
          "link": "/battle/doubleFestival",
          "id": 133,
          "label": 0
        },
        {
          "isNeedLogin": 1,
          "nightIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/24cb0b342190474aad36ab5845afa594.png",
          "dayIcon": "https://noahex-dev-public.s3.ap-northeast-1.amazonaws.com/c4ca4238a0b923820dcc509a6f75849b/public/app/12a48720d7a84c3aa8a33e955d503619.png",
          "nameAll": {
            "kk": "IM 英语跳转",
            "ptbr": "IM 英语跳转",
            "mn": "IM 英语跳转",
            "ru": "IM 英语跳转",
            "tw": "IM 英语跳转",
            "ko": "IM 英语跳转",
            "pt": "IM 英语跳转",
            "ms": "IM 英语跳转",
            "en": "IM 英语跳转",
            "cn": "IM 跳转",
            "es": "IM 英语跳转",
            "vi": "IM 英语跳转",
            "th": "IM 英语跳转",
            "ja": "IM 英语跳转",
            "az": "IM1",
            "id": "IM 英语跳转",
            "pt ": "IM 英语跳转"
          },
          "name": "IM 跳转",
          "link": "noahex://app.com/home/message/messageList",
          "id": 134,
          "label": 1
        }
      ]
    }
  ],
  "msg": "Success.",
  "msgInfo": {
    "template": "Success."
  },
  "ts": 1776593049956
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:10.012053" elapsed="0.000625"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-04-19T18:04:10.008441" elapsed="0.004305"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.013817" 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-04-19T18:04:10.013298" elapsed="0.000547"/>
</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-04-19T18:04:10.014186" elapsed="0.000552"/>
</kw>
<msg time="2026-04-19T18:04:10.014830" 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-04-19T18:04:10.013999" elapsed="0.000857"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.015158" 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-04-19T18:04:10.014999" elapsed="0.000185"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.015517" 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-04-19T18:04:10.015308" elapsed="0.000244"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.015850" 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-04-19T18:04:10.015677" elapsed="0.000203"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.016280" 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-04-19T18:04:10.015998" elapsed="0.000314"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.016606" 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-04-19T18:04:10.016428" elapsed="0.000203"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.016838" 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-04-19T18:04:10.016738" elapsed="0.000138"/>
</kw>
<arg>获取Vajra District列表</arg>
<arg>/v1/app/public/vajra-district/list</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-04-19T18:04:10.012954" elapsed="0.003977"/>
</kw>
<doc>验证Vajra District列表接口功能</doc>
<tag>app</tag>
<status status="PASS" start="2026-04-19T18:04:09.102008" elapsed="0.915112"/>
</test>
<doc>Vajra District 接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:09.090026" elapsed="0.927562"/>
</suite>
<status status="PASS" start="2026-04-19T18:04:02.206053" elapsed="7.812616"/>
</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-04-19T18:04:10.026263" 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-04-19T18:04:10.025990" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.026835" 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-04-19T18:04:10.026668" elapsed="0.000224"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:10.026413" elapsed="0.000521"/>
</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-04-19T18:04:10.027079" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:10.026967" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:10.026387" elapsed="0.000769"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.027919" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:10.027776" elapsed="0.000197"/>
</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-04-19T18:04:10.028247" 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-04-19T18:04:10.028390" 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-04-19T18:04:10.028521" 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-04-19T18:04:10.028638" 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-04-19T18:04:10.028744" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:10.028049" elapsed="0.000780"/>
</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-04-19T18:04:10.029022" 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-04-19T18:04:10.029138" 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-04-19T18:04:10.029250" 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-04-19T18:04:10.029361" 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-04-19T18:04:10.029469" 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-04-19T18:04:10.029577" 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-04-19T18:04:10.029681" 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-04-19T18:04:10.029783" 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-04-19T18:04:10.029890" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:10.028857" elapsed="0.001081"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.030292" 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-04-19T18:04:10.030050" elapsed="0.000281"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.030634" 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-04-19T18:04:10.030435" elapsed="0.000238"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.030965" 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-04-19T18:04:10.030776" elapsed="0.000225"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.031308" 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-04-19T18:04:10.031108" elapsed="0.000236"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.031642" 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-04-19T18:04:10.031444" elapsed="0.000233"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.031968" 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-04-19T18:04:10.031774" elapsed="0.000229"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.032310" 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-04-19T18:04:10.032101" elapsed="0.000245"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.032655" 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-04-19T18:04:10.032442" elapsed="0.000249"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.033000" 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-04-19T18:04:10.032791" elapsed="0.000244"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:10.029960" elapsed="0.003106"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:10.028030" elapsed="0.005056"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.033339" 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-04-19T18:04:10.033179" elapsed="0.000203"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:10.033781" 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-04-19T18:04:10.033487" elapsed="0.000483"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:10.027482" elapsed="0.006551"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.034223" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:10.034132" elapsed="0.000129"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:10.025625" elapsed="0.008686"/>
</kw>
<test id="s1-s2-s1-s1-t1" name="获取期货U本位交易对详情" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.035854" 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-04-19T18:04:10.035648" elapsed="0.000231"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.037342" 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-04-19T18:04:10.036788" elapsed="0.000603"/>
</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-04-19T18:04:10.037941" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:10.037498" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:10.037481" elapsed="0.000529"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:10.038039" elapsed="0.000030"/>
</return>
<msg time="2026-04-19T18:04:10.038212" 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-04-19T18:04:10.036071" elapsed="0.002162"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:10.836740" 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-04-19T18:04:10.837174" 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': 'Sun, 19 Apr 2026 10:04:10 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '0bc05ddd599f18a67c103bda63b69008', 'X-Transparent': '00-0bc05ddd599f18a67c103bda63b69008-cc9341f6cffa8e05-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': '9eeb15664fb53030-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.1","takerFee":"0.1","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":1776593050673} 
 </msg>
<msg time="2026-04-19T18:04:10.837393" 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-04-19T18:04:10.837837" 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-04-19T18:04:10.038703" elapsed="0.799200"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:10.838149" elapsed="0.000143"/>
</return>
<msg time="2026-04-19T18:04:10.838707" 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-04-19T18:04:10.038357" elapsed="0.800403"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.841552" 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-04-19T18:04:10.840272" elapsed="0.001438"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.843089" 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-04-19T18:04:10.841988" elapsed="0.001157"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.843710" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:10.843416" elapsed="0.000389"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:10.839359" elapsed="0.004580"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.846044" 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-04-19T18:04:10.844952" elapsed="0.001141"/>
</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-04-19T18:04:10.846287" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.846952" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:10.846762" elapsed="0.000254"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-04-19T18:04:10.844307" elapsed="0.002796"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.848636" 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-04-19T18:04:10.847765" elapsed="0.000914"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.849625" 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-04-19T18:04:10.848890" elapsed="0.000769"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.850009" 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.1",
    "takerFee": "0.1",
    "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": 1776593050673
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:10.849799" elapsed="0.000335"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-04-19T18:04:10.847352" elapsed="0.002854"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:10.851072" 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-04-19T18:04:10.850354" elapsed="0.000752"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.851505" 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-04-19T18:04:10.851268" elapsed="0.000310"/>
</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-04-19T18:04:10.851727" elapsed="0.000318"/>
</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-04-19T18:04:10.852233" elapsed="0.000225"/>
</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-04-19T18:04:10.853391" elapsed="0.000221"/>
</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-04-19T18:04:10.853728" elapsed="0.000181"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:10.854197" 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-04-19T18:04:10.854033" elapsed="0.000191"/>
</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-04-19T18:04:10.854687" elapsed="0.000171"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.855414" 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-04-19T18:04:10.854976" elapsed="0.000483"/>
</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-04-19T18:04:10.855592" elapsed="0.000461"/>
</kw>
<arg>${symbol}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:10.854387" elapsed="0.001734"/>
</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-04-19T18:04:10.856292" elapsed="0.000179"/>
</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-04-19T18:04:10.856593" elapsed="0.000143"/>
</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-04-19T18:04:10.856856" elapsed="0.000142"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'baseAssetPrecision' in $symbol_detail</arg>
<arg>验证基础资产精度</arg>
<arg>${symbol_detail['baseAssetPrecision']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:10.857116" elapsed="0.000130"/>
</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-04-19T18:04:10.857349" elapsed="0.000130"/>
</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-04-19T18:04:10.857583" elapsed="0.000128"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'icebergAllowed' in $symbol_detail</arg>
<arg>验证冰山订单允许</arg>
<arg>${symbol_detail['icebergAllowed']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:10.857811" elapsed="0.000119"/>
</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-04-19T18:04:10.858030" elapsed="0.000120"/>
</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-04-19T18:04:10.858249" elapsed="0.000128"/>
</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-04-19T18:04:10.858477" elapsed="0.000124"/>
</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-04-19T18:04:10.858702" elapsed="0.000120"/>
</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-04-19T18:04:10.858924" elapsed="0.000121"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.859255" level="INFO">✅ 期货交易对详情项验证通过: btc_usdt</msg>
<arg>✅ 期货交易对详情项验证通过: ${symbol}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:10.859139" elapsed="0.000155"/>
</kw>
<arg>${data}</arg>
<doc>验证单个期货交易对详情项的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:10.853080" elapsed="0.006260"/>
</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-04-19T18:04:10.852612" elapsed="0.006771"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.860321" 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-04-19T18:04:10.859855" elapsed="0.000491"/>
</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-04-19T18:04:10.860609" elapsed="0.000452"/>
</kw>
<msg time="2026-04-19T18:04:10.861135" 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-04-19T18:04:10.860462" elapsed="0.000693"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.861391" 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-04-19T18:04:10.861261" elapsed="0.000149"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.861670" 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-04-19T18:04:10.861510" elapsed="0.000179"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.861916" 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-04-19T18:04:10.861784" elapsed="0.000160"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.862249" 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-04-19T18:04:10.862031" elapsed="0.000245"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.862520" 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-04-19T18:04:10.862365" elapsed="0.000176"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.862795" 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-04-19T18:04:10.862700" elapsed="0.000132"/>
</kw>
<arg>获取期货U本位交易对详情</arg>
<arg>/v1/future-u/market/public/symbol/detail</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-04-19T18:04:10.859569" elapsed="0.003307"/>
</kw>
<doc>验证期货U本位交易对详情接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:10.034379" elapsed="0.828666"/>
</test>
<test id="s1-s2-s1-s1-t2" name="获取期货U本位其他交易对详情" line="35">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.864999" 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-04-19T18:04:10.864795" elapsed="0.000287"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:10.867138" 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-04-19T18:04:10.866361" elapsed="0.000813"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:10.867939" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:10.867337" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:10.867311" elapsed="0.000724"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:10.868073" elapsed="0.000033"/>
</return>
<msg time="2026-04-19T18:04:10.868301" 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-04-19T18:04:10.865397" elapsed="0.002934"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:11.072735" 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-04-19T18:04:11.073131" 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': 'Sun, 19 Apr 2026 10:04:11 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '9167b3b3c9ea9e0c01d5778d590d2b26', 'X-Transparent': '00-9167b3b3c9ea9e0c01d5778d590d2b26-dd9af82e3a6c6ac7-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': '9eeb15689cf23030-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":1776593051031} 
 </msg>
<msg time="2026-04-19T18:04:11.073326" 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-04-19T18:04:11.073745" 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-04-19T18:04:10.868981" elapsed="0.204850"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:11.074050" elapsed="0.000155"/>
</return>
<msg time="2026-04-19T18:04:11.074663" 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-04-19T18:04:10.868492" elapsed="0.206229"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.077301" 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-04-19T18:04:11.076111" elapsed="0.001327"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.078415" 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-04-19T18:04:11.077695" elapsed="0.000759"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.078837" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:11.078632" elapsed="0.000269"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:11.075296" elapsed="0.003694"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.080595" 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-04-19T18:04:11.079696" elapsed="0.000944"/>
</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-04-19T18:04:11.080816" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.081457" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:11.081265" elapsed="0.000256"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-04-19T18:04:11.079242" elapsed="0.002370"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.083295" 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-04-19T18:04:11.082598" elapsed="0.000733"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.084133" 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-04-19T18:04:11.083482" elapsed="0.000689"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.084537" 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": 1776593051031
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:11.084305" elapsed="0.000410"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-04-19T18:04:11.081821" elapsed="0.002964"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:11.085667" 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-04-19T18:04:11.084935" elapsed="0.000766"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.086077" 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-04-19T18:04:11.085856" elapsed="0.000286"/>
</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-04-19T18:04:11.086350" elapsed="0.000322"/>
</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-04-19T18:04:11.086841" elapsed="0.000224"/>
</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-04-19T18:04:11.088021" elapsed="0.000243"/>
</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-04-19T18:04:11.088439" elapsed="0.000202"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:11.088963" 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-04-19T18:04:11.088772" elapsed="0.000223"/>
</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-04-19T18:04:11.089507" elapsed="0.000187"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.089959" 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-04-19T18:04:11.089813" elapsed="0.000190"/>
</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-04-19T18:04:11.090121" elapsed="0.000177"/>
</kw>
<arg>${symbol}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:11.089178" elapsed="0.001187"/>
</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-04-19T18:04:11.090481" elapsed="0.000164"/>
</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-04-19T18:04:11.090768" elapsed="0.000144"/>
</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-04-19T18:04:11.091030" elapsed="0.000142"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'baseAssetPrecision' in $symbol_detail</arg>
<arg>验证基础资产精度</arg>
<arg>${symbol_detail['baseAssetPrecision']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:11.091287" elapsed="0.000142"/>
</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-04-19T18:04:11.091544" elapsed="0.000145"/>
</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-04-19T18:04:11.091803" elapsed="0.000142"/>
</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-04-19T18:04:11.092064" elapsed="0.000135"/>
</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-04-19T18:04:11.092313" elapsed="0.000152"/>
</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-04-19T18:04:11.092579" elapsed="0.000137"/>
</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-04-19T18:04:11.092831" elapsed="0.000144"/>
</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-04-19T18:04:11.093087" elapsed="0.000139"/>
</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-04-19T18:04:11.093342" elapsed="0.000135"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.093698" level="INFO">✅ 期货交易对详情项验证通过: eth_usdt</msg>
<arg>✅ 期货交易对详情项验证通过: ${symbol}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:11.093579" elapsed="0.000160"/>
</kw>
<arg>${data}</arg>
<doc>验证单个期货交易对详情项的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:11.087678" elapsed="0.006116"/>
</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-04-19T18:04:11.087216" elapsed="0.006620"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.094773" 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-04-19T18:04:11.094311" elapsed="0.000485"/>
</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-04-19T18:04:11.095057" elapsed="0.000438"/>
</kw>
<msg time="2026-04-19T18:04:11.095573" 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-04-19T18:04:11.094916" elapsed="0.000678"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.095841" 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-04-19T18:04:11.095707" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.096137" 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-04-19T18:04:11.095965" elapsed="0.000193"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.096457" 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-04-19T18:04:11.096308" elapsed="0.000171"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.096833" 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-04-19T18:04:11.096580" elapsed="0.000279"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.097129" 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-04-19T18:04:11.096957" elapsed="0.000198"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.097349" 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-04-19T18:04:11.097254" elapsed="0.000136"/>
</kw>
<arg>获取期货U本位其他交易对详情</arg>
<arg>/v1/future-u/market/public/symbol/detail</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-04-19T18:04:11.094022" elapsed="0.003416"/>
</kw>
<doc>验证期货U本位其他交易对详情接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:10.863299" elapsed="0.234340"/>
</test>
<doc>期货U本位交易对详情接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:10.021873" elapsed="1.076193"/>
</suite>
<status status="PASS" start="2026-04-19T18:04:10.020995" elapsed="1.078291"/>
</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-04-19T18:04:11.106104" 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-04-19T18:04:11.105908" elapsed="0.000224"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.106533" 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-04-19T18:04:11.106407" elapsed="0.000167"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:11.106216" elapsed="0.000390"/>
</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-04-19T18:04:11.106729" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:11.106638" elapsed="0.000139"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:11.106192" elapsed="0.000603"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.107419" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:11.107301" elapsed="0.000158"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:11.107664" 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-04-19T18:04:11.107772" 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-04-19T18:04:11.107878" 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-04-19T18:04:11.107978" 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-04-19T18:04:11.108087" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:11.107517" elapsed="0.000614"/>
</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-04-19T18:04:11.108293" 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-04-19T18:04:11.108396" 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-04-19T18:04:11.108499" 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-04-19T18:04:11.108596" 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-04-19T18:04:11.108700" 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-04-19T18:04:11.108801" 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-04-19T18:04:11.108898" 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-04-19T18:04:11.109032" 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-04-19T18:04:11.109133" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:11.108153" elapsed="0.001024"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.109502" 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-04-19T18:04:11.109281" elapsed="0.000258"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.109834" 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-04-19T18:04:11.109638" elapsed="0.000231"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.110157" 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-04-19T18:04:11.109967" elapsed="0.000225"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.110480" 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-04-19T18:04:11.110289" elapsed="0.000226"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.110806" 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-04-19T18:04:11.110611" elapsed="0.000230"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.111131" 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-04-19T18:04:11.110937" elapsed="0.000229"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.111575" 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-04-19T18:04:11.111262" elapsed="0.000351"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.111912" 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-04-19T18:04:11.111711" elapsed="0.000237"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.112253" 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-04-19T18:04:11.112046" elapsed="0.000244"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:11.109197" elapsed="0.003125"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:11.107502" elapsed="0.004838"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.112571" 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-04-19T18:04:11.112427" elapsed="0.000184"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:11.112982" 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-04-19T18:04:11.112713" elapsed="0.000433"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:11.107060" elapsed="0.006147"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.113373" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:11.113298" elapsed="0.000107"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:11.105678" elapsed="0.007768"/>
</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-04-19T18:04:11.115763" 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-04-19T18:04:11.115232" elapsed="0.000554"/>
</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-04-19T18:04:11.116303" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:11.115885" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:11.115870" elapsed="0.000500"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:11.116400" elapsed="0.000027"/>
</return>
<msg time="2026-04-19T18:04:11.116565" 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-04-19T18:04:11.114624" elapsed="0.001962"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:11.717236" 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-04-19T18:04:11.717778" 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': 'Sun, 19 Apr 2026 10:04:11 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '409da69fb2d2f4a2397f95332e65f014', 'X-Transparent': '00-409da69fb2d2f4a2397f95332e65f014-ef80f6bc9e27667d-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': '9eeb156c986284ac-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1776593051678,"s":"btc_usdt","u":1423187495931,"b":[["75023.4","22468"],["75023.3","25324"],["75023","6751"],["75022.6","40458"],["75022.5","165304"],["75022.4","160940"],["75022.3","131160"],["75022.1","8475"],["75022","2582"],["75021.5","28559"],["75021.3","27456"],["75020.5","22644"],["75020.2","5993"],["75020","29767"],["75019.6","3345"],["75019.4","3815"],["75019.1","21495"],["75018.7","2327"],["75017.5","4261"],["75016.4","14173"],["75016.1","2477"],["75016","6780"],["75015.1","20420"],["75014.6","6999"],["75013.9","4502"],["75013.3","3502"],["75012.8","3478"],["75012.1","3956"],["75010.3","10898"],["75009.9","20577"],["75009.6","3517"],["75007.9","18968"],["75005.8","1112"],["75005","32974"],["75004.4","9577"],["75004.2","2951"],["75003.1","13317"],["75002.8","23508"],["75001.6","5989"],["75001.1","14566"],["74999.2","5598"],["74998.6","3669"],["74997.4","17065"],["74996.6","22619"],["74996.2","3737"],["74995.6","2455"],["74994.2","26244"],["74994.1","15231"],["74992.3","4770"],["74991.8","3603"],["74990.6","23000"],["74989.1","3723"],["74986.9","4224"],["74986.8","3234"],["74984.5","26719"],["74984","16421"],["74981.4","2232"],["74978.2","2816"],["74974.7","2320"],["74974.5","7266"],["74973.8","25811"],["74972.7","3026"],["74966.8","5788"],["74964.5","2403"],["74964.4","31270"],["74963.8","20050"],["74962.2","5615"],["74961.7","4912"],["74961.4","38646"],["74960.3","2687"],["74959.6","29637"],["74955.1","9094"],["74954.8","32440"],["74954.5","1919"],["74953.8","27190"],["74953.7","5513"],["74952.9","12287"],["74951.8","2988"],["74950.9","4591"],["74948.9","3059"],["74945.2","2935"],["74942.5","2842"],["74941.6","3467"],["74939.9","3379"],["74932.6","21133"],["74929.2","16136"],["74925.9","6353"],["74925.3","3631"],["74925","3267"],["74924.6","4203"],["74923","61867"],["74918.4","20191"],["74918","3021"],["74914.6","38878"],["74913.7","4945"],["74913.3","18161"],["74913","4200"],["74907","25181"],["74904.4","12021"],["74899.2","29323"]],"a":[["75023.5","19924"],["75023.6","23236"],["75023.7","54600"],["75023.8","3131"],["75024","24932"],["75024.1","22200"],["75024.5","3568"],["75024.7","5468"],["75024.8","131436"],["75024.9","311700"],["75025.1","3351"],["75025.7","26031"],["75026.2","13424"],["75026.7","5947"],["75027.6","20904"],["75027.7","4896"],["75028.7","5013"],["75028.8","18508"],["75029.8","16602"],["75029.9","4841"],["75030.6","5832"],["75030.8","12138"],["75031.5","3292"],["75032.1","2784"],["75033.2","5105"],["75033.5","3113"],["75033.9","35230"],["75035.3","15882"],["75035.5","10350"],["75036.7","32929"],["75037","16361"],["75037.2","7357"],["75038","4674"],["75038.2","47261"],["75039.8","3290"],["75040.7","12980"],["75040.8","4948"],["75041.5","5032"],["75043","32027"],["75044.2","2130"],["75045","3810"],["75045.5","20887"],["75045.9","3850"],["75050.3","10803"],["75050.8","12166"],["75052.6","3246"],["75053.4","2763"],["75054","5015"],["75054.2","2309"],["75056.7","18451"],["75058.9","5384"],["75059.5","1829"],["75059.6","3960"],["75060.5","31768"],["75063.4","24814"],["75063.6","3143"],["75064","11030"],["75065.1","17205"],["75066.9","6714"],["75068.9","3862"],["75070.1","11456"],["75073.2","5914"],["75074.1","4002"],["75074.8","10725"],["75075","13031"],["75079.8","1667"],["75080.8","2119"],["75082","9091"],["75084","21983"],["75085.9","2234"],["75086.9","5132"],["75088.4","39010"],["75088.6","13513"],["75092.9","3889"],["75095","4577"],["75095.7","17417"],["75096.7","3450"],["75096.8","80097"],["75100.4","14974"],["75101.1","1591"],["75101.7","27968"],["75102","4777"],["75103.7","22142"],["75107.7","4441"],["75113.6","16114"],["75113.8","4095"],["75114","37013"],["75115.8","3995"],["75117.3","3815"],["75118.7","2368"],["75118.8","3607"],["75124.1","36074"],["75128.3","16569"],["75129.4","10216"],["75130.3","4382"],["75130.6","3421"],["75133.3","15453"],["75134.3","12155"],["75142.6","3058"],["75146.3","2339"]]},"ts":1776593051678} 
 </msg>
<msg time="2026-04-19T18:04:11.718026" 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-04-19T18:04:11.718372" 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-04-19T18:04:11.116995" elapsed="0.601443"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:11.718650" elapsed="0.000135"/>
</return>
<msg time="2026-04-19T18:04:11.719170" 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-04-19T18:04:11.116700" elapsed="0.602528"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.721939" 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-04-19T18:04:11.720673" elapsed="0.001429"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.723420" 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-04-19T18:04:11.722379" elapsed="0.001101"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.724024" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:11.723723" elapsed="0.000397"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:11.719818" elapsed="0.004484"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.725672" 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-04-19T18:04:11.724536" elapsed="0.001248"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:11.727278" level="INFO">${data} = {'t': 1776593051678, 's': 'btc_usdt', 'u': 1423187495931, 'b': [['75023.4', '22468'], ['75023.3', '25324'], ['75023', '6751'], ['75022.6', '40458'], ['75022.5', '165304'], ['75022.4', '160940'], ['750...</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-04-19T18:04:11.726011" elapsed="0.001316"/>
</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-04-19T18:04:11.727528" elapsed="0.000221"/>
</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-04-19T18:04:11.727909" elapsed="0.000576"/>
</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-04-19T18:04:11.728661" elapsed="0.000212"/>
</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-04-19T18:04:11.729036" elapsed="0.000187"/>
</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-04-19T18:04:11.729390" elapsed="0.000183"/>
</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-04-19T18:04:11.729757" elapsed="0.000822"/>
</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-04-19T18:04:11.730758" elapsed="0.000804"/>
</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-04-19T18:04:11.731695" elapsed="0.000598"/>
</kw>
<doc>验证期货U本位深度数据接口功能（BTC/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:11.113494" elapsed="0.619023"/>
</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-04-19T18:04:11.736724" 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-04-19T18:04:11.735908" elapsed="0.000853"/>
</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-04-19T18:04:11.737558" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:11.736937" elapsed="0.000697"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:11.736901" elapsed="0.000765"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:11.737708" elapsed="0.000039"/>
</return>
<msg time="2026-04-19T18:04:11.737947" 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-04-19T18:04:11.734986" elapsed="0.002993"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:12.079237" 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-04-19T18:04:12.079674" 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': 'Sun, 19 Apr 2026 10:04:12 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '28a6d80fbd62666d4f55e0c9b1f96a3c', 'X-Transparent': '00-28a6d80fbd62666d4f55e0c9b1f96a3c-1a85e1a473504d0b-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': '9eeb156eea1f84ac-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1776593052040,"s":"eth_usdt","u":1423125091543,"b":[],"a":[]},"ts":1776593052040} 
 </msg>
<msg time="2026-04-19T18:04:12.079863" 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-04-19T18:04:12.080403" 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-04-19T18:04:11.738632" elapsed="0.341839"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:12.080745" elapsed="0.000173"/>
</return>
<msg time="2026-04-19T18:04:12.081357" 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-04-19T18:04:11.738171" elapsed="0.343242"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:12.084181" 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-04-19T18:04:12.082976" elapsed="0.001351"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:12.085650" 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-04-19T18:04:12.084602" elapsed="0.001105"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:12.086277" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:12.085977" elapsed="0.000389"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:12.082053" elapsed="0.004441"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:12.087756" 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-04-19T18:04:12.086738" elapsed="0.001109"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:12.089093" level="INFO">${data} = {'t': 1776593052040, 's': 'eth_usdt', 'u': 1423125091543, '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-04-19T18:04:12.088080" elapsed="0.001081"/>
</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-04-19T18:04:12.089362" elapsed="0.000223"/>
</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-04-19T18:04:12.089757" elapsed="0.000195"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>u</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:12.090111" elapsed="0.000190"/>
</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-04-19T18:04:12.090469" elapsed="0.000188"/>
</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-04-19T18:04:12.090817" elapsed="0.000185"/>
</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-04-19T18:04:12.091191" elapsed="0.004002"/>
</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-04-19T18:04:12.095362" elapsed="0.000682"/>
</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-04-19T18:04:12.096180" elapsed="0.000603"/>
</kw>
<doc>验证期货U本位深度数据接口功能（ETH/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:11.732870" elapsed="0.364138"/>
</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-04-19T18:04:12.101010" 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-04-19T18:04:12.100167" elapsed="0.000877"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:12.101742" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:12.101219" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:12.101185" elapsed="0.000652"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:12.101876" elapsed="0.000034"/>
</return>
<msg time="2026-04-19T18:04:12.102078" 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-04-19T18:04:12.099286" elapsed="0.002815"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:12.407531" 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-04-19T18:04:12.408092" 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': 'Sun, 19 Apr 2026 10:04:12 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': 'ec69998f257a47dd6e4682284633cdb0', 'X-Transparent': '00-ec69998f257a47dd6e4682284633cdb0-fa29bd250a2a8d31-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': '9eeb15704b2a84ac-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1776593052272,"s":"sol_usdt","u":1423125089152,"b":[["29.85","335"],["26.57","646"],["21.36","2902"],["21.25","2"],["16.57","2910"],["11.99","3968"],["11.30","496"],["7.55","2117"],["4.71","2065"]],"a":[["85.80","19536"],["85.81","19020"],["85.83","19505"],["85.85","9591"],["85.90","3464"],["85.91","10102"],["85.92","23059"],["85.98","4445"],["86.00","3360"],["86.13","3021"],["86.15","20910"],["86.20","3676"],["86.25","12917"],["86.26","9337"],["86.44","15749"],["86.46","3796"],["86.49","2705"],["86.52","2065"],["86.55","1068"],["86.61","27390"],["86.67","3774"],["86.88","4119"],["87.20","16737"],["87.21","3161"],["87.32","1913"],["87.44","28701"],["87.58","2532"],["87.84","22096"],["87.85","4419"],["87.89","2109"],["87.94","21171"],["88.43","3448"],["88.52","5096"],["88.63","4825"],["88.75","9667"],["88.83","1080"],["89.08","3106"],["89.10","3261"],["89.24","10663"],["89.63","3277"],["90.08","1630"],["90.15","2860"],["90.16","9196"],["90.43","12855"],["90.75","7281"],["90.91","21271"],["91.80","19689"],["91.94","1261"],["92.02","2322"],["92.23","2553"],["92.39","7431"],["92.53","2369"],["92.67","3842"],["92.74","1611"],["92.89","20218"],["93.24","3087"],["93.33","1427"],["93.37","16921"],["93.45","2230"],["93.66","38420"],["94.14","13849"],["94.41","3047"],["94.79","1487"],["94.82","14997"],["94.92","25764"],["95.13","3940"],["95.40","4309"],["96.67","9164"],["97.51","2668"],["97.76","6394"],["97.77","3239"],["98.04","2988"],["98.39","13757"],["98.52","38641"],["98.65","12816"],["99.29","4689"],["99.35","13150"],["99.50","19449"],["100.42","12043"],["100.43","1153"],["100.85","21820"],["101.26","2661"],["101.78","2699"],["102.25","2125"],["102.33","2388"],["102.67","5134"],["103.24","4973"],["103.31","18106"],["103.80","2168"],["104.21","19219"],["104.51","2137"],["105.52","14876"],["106.56","3387"],["106.92","8681"],["106.95","3091"],["107.06","3487"],["107.66","3930"],["108.78","1171"],["108.82","19712"],["109.67","3910"]]},"ts":1776593052272} 
 </msg>
<msg time="2026-04-19T18:04:12.408325" 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-04-19T18:04:12.408717" 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-04-19T18:04:12.102648" elapsed="0.306135"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:12.409062" elapsed="0.000164"/>
</return>
<msg time="2026-04-19T18:04:12.409644" 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-04-19T18:04:12.102249" elapsed="0.307449"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:12.412481" 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-04-19T18:04:12.411281" elapsed="0.001336"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:12.413926" 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-04-19T18:04:12.412884" elapsed="0.001099"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:12.414530" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:12.414234" elapsed="0.000393"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:12.410371" elapsed="0.004380"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:12.415990" 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-04-19T18:04:12.414988" elapsed="0.001083"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:12.417107" level="INFO">${data} = {'t': 1776593052272, 's': 'sol_usdt', 'u': 1423125089152, 'b': [['29.85', '335'], ['26.57', '646'], ['21.36', '2902'], ['21.25', '2'], ['16.57', '2910'], ['11.99', '3968'], ['11.30', '496'], ['7.55', ...</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-04-19T18:04:12.416251" elapsed="0.000902"/>
</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-04-19T18:04:12.417336" elapsed="0.000226"/>
</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-04-19T18:04:12.417733" elapsed="0.000191"/>
</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-04-19T18:04:12.418095" elapsed="0.000189"/>
</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-04-19T18:04:12.418453" elapsed="0.000204"/>
</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-04-19T18:04:12.418905" elapsed="0.000198"/>
</kw>
<kw name="Should Be Equal As Strings" owner="BuiltIn">
<arg>${data['s']}</arg>
<arg>sol_usdt</arg>
<doc>Fails if objects are unequal after converting them to strings.</doc>
<status status="PASS" start="2026-04-19T18:04:12.419284" elapsed="0.000736"/>
</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-04-19T18:04:12.420159" elapsed="0.000689"/>
</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-04-19T18:04:12.420983" elapsed="0.000645"/>
</kw>
<doc>验证期货U本位深度数据接口功能（SOL/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:12.097372" elapsed="0.324480"/>
</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-04-19T18:04:12.426918" 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-04-19T18:04:12.426050" elapsed="0.000901"/>
</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-04-19T18:04:12.427664" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:12.427139" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:12.427104" elapsed="0.000648"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:12.427797" elapsed="0.000034"/>
</return>
<msg time="2026-04-19T18:04:12.427996" 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-04-19T18:04:12.425135" elapsed="0.002885"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:12.643612" 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-04-19T18:04:12.643968" 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': 'Sun, 19 Apr 2026 10:04:12 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9997', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': 'eed49417c7ff54ccf4e18cad290b8655', 'X-Transparent': '00-eed49417c7ff54ccf4e18cad290b8655-9ed0ef9df7663ee2-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': '9eeb15725cbf84ac-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1776593052597,"s":"btc_usdt","u":1423187495931,"b":[["75023.4","22468"],["75023.3","25324"],["75023","6751"],["75022.6","40458"],["75022.5","165304"],["75022.4","160940"],["75022.3","131160"],["75022.1","8475"],["75022","2582"],["75021.5","28559"],["75021.3","27456"],["75020.5","22644"],["75020.2","5993"],["75020","29767"],["75019.6","3345"],["75019.4","3815"],["75019.1","21495"],["75018.7","2327"],["75017.5","4261"],["75016.4","14173"],["75016.1","2477"],["75016","6780"],["75015.1","20420"],["75014.6","6999"],["75013.9","4502"],["75013.3","3502"],["75012.8","3478"],["75012.1","3956"],["75010.3","10898"],["75009.9","20577"],["75009.6","3517"],["75007.9","18968"],["75005.8","1112"],["75005","32974"],["75004.4","9577"],["75004.2","2951"],["75003.1","13317"],["75002.8","23508"],["75001.6","5989"],["75001.1","14566"],["74999.2","5598"],["74998.6","3669"],["74997.4","17065"],["74996.6","22619"],["74996.2","3737"],["74995.6","2455"],["74994.2","26244"],["74994.1","15231"],["74992.3","4770"],["74991.8","3603"],["74990.6","23000"],["74989.1","3723"],["74986.9","4224"],["74986.8","3234"],["74984.5","26719"],["74984","16421"],["74981.4","2232"],["74978.2","2816"],["74974.7","2320"],["74974.5","7266"],["74973.8","25811"],["74972.7","3026"],["74966.8","5788"],["74964.5","2403"],["74964.4","31270"],["74963.8","20050"],["74962.2","5615"],["74961.7","4912"],["74961.4","38646"],["74960.3","2687"],["74959.6","29637"],["74955.1","9094"],["74954.8","32440"],["74954.5","1919"],["74953.8","27190"],["74953.7","5513"],["74952.9","12287"],["74951.8","2988"],["74950.9","4591"],["74948.9","3059"],["74945.2","2935"],["74942.5","2842"],["74941.6","3467"],["74939.9","3379"],["74932.6","21133"],["74929.2","16136"],["74925.9","6353"],["74925.3","3631"],["74925","3267"],["74924.6","4203"],["74923","61867"],["74918.4","20191"],["74918","3021"],["74914.6","38878"],["74913.7","4945"],["74913.3","18161"],["74913","4200"],["74907","25181"],["74904.4","12021"],["74899.2","29323"],["74897.5","3187"],["74897.3","29544"],["74897","3493"],["74896.6","11927"],["74895.8","3455"],["74892.6","2501"],["74891.2","33494"],["74890.2","25692"],["74888.7","3660"],["74886.9","9122"],["74879.7","4249"],["74878.7","35842"],["74878.5","31307"],["74877.8","4030"],["74872.9","37600"],["74870.5","25127"],["74856.4","2883"],["74855.7","2729"],["74854.3","9771"],["74854.2","38700"],["74849.5","23389"],["74844.8","1938"],["74843.9","5248"],["74843.3","3653"],["74842","6625"],["74833.6","39589"],["74831.2","4512"],["74829.8","27811"],["74826.4","370"],["74825.3","24313"],["74824.1","3937"],["74823.3","4460"],["74822.8","15524"],["74816.5","20398"],["74815.4","2488"],["74812.6","29641"],["74810.9","3635"],["74807.7","12571"],["74805.1","4972"],["74804","36711"],["74800.7","4388"],["74799.4","4714"],["74799.3","4865"],["74794.2","25044"],["74791","3915"],["74787.8","8737"],["74782.4","18141"],["74770.8","3789"],["74766.3","5293"],["74762","9770"],["74752.7","13800"],["74751.5","26543"],["74744.1","3827"],["74742.1","4399"],["74741.9","2189"],["74739.7","6600"],["74737.2","3996"],["74736.4","2481"],["74734.8","3730"],["74732.4","1739"],["74729.8","19926"],["74728.8","3098"],["74726","4190"],["74725.9","4366"],["74721.5","3586"],["74720.2","1490"],["74719.4","23816"],["74716","26191"],["74715.1","3374"],["74711","35629"],["74710.9","5737"],["74708.4","4528"],["74706.1","12398"],["74703.9","3084"],["74701.8","14993"],["74700.2","4066"],["74691.2","27850"],["74681.5","3205"],["74676.4","4121"],["74674.8","9274"],["74672.9","43277"],["74670.7","2559"],["74667.9","3858"],["74667.7","12552"],["74659.9","44015"],["74658.3","25436"],["74653.7","3820"],["74653.1","3240"],["74642.3","20083"],["74639.4","2656"],["74638.7","27357"],["74623.5","4487"],["74616.4","35037"],["74616","2760"],["74609.7","3901"],["74595.8","4084"],["74594.5","19742"],["74590.4","2756"],["74587.2","20393"],["74571.9","14054"],["74568.1","7797"],["74564.9","4387"],["74558.6","20692"],["74548.4","4321"],["74540.7","11761"],["74538.6","5024"],["74536.3","4449"],["74529.9","19102"],["74527","4592"],["74514.6","18592"],["74507.2","16621"],["74481.9","23936"],["74481.5","18252"],["74478.5","13662"],["74478.3","25719"],["74470.2","2560"],["74466.2","29990"],["74461.2","5597"],["74460.9","11598"],["74455.8","17582"],["74448.1","16458"],["74446.4","26738"],["74441","3563"],["74436.5","4607"],["74435","6057"],["74433.2","10245"],["74426.1","3381"],["74425.6","21078"],["74425.4","17060"],["74409.1","22068"],["74408.9","1129"],["74407.8","3430"],["74403.3","28686"],["74402.7","3457"],["74402","3048"],["74401.8","6651"],["74398.3","34097"],["74384.9","2627"],["74378.7","4479"],["74374.8","3339"],["74363.9","35643"],["74362.4","3224"],["74357.5","53978"],["74354.7","3089"],["74352.4","4993"],["74351.1","3188"],["74350.3","5835"],["74347.5","37527"],["74342","60219"],["74341.2","3023"],["74341","5050"],["74339","9326"],["74334.7","7969"],["74333.2","33783"],["74329.5","5933"],["74326.9","2384"],["74324.7","2796"],["74322.8","14738"],["74317.3","30292"],["74300.8","13778"],["74300.3","15074"],["74299.2","19930"],["74298.6","5254"],["74290.5","29096"],["74287.6","7270"],["74281.9","2763"],["74276.7","24154"],["74275.5","7871"],["74273.2","4862"],["74271","3117"],["74269.4","22628"],["74268.8","2062"],["74267.4","3348"],["74254.3","1876"],["74252.8","36227"],["74245.6","4261"],["74245.4","37673"],["74242.6","1914"],["74237.9","20283"],["74236.7","23572"],["74235.9","26421"],["74230.5","33864"]],"a":[["75023.5","19924"],["75023.6","23236"],["75023.7","54600"],["75023.8","3131"],["75024","24932"],["75024.1","22200"],["75024.5","3568"],["75024.7","5468"],["75024.8","131436"],["75024.9","311700"],["75025.1","3351"],["75025.7","26031"],["75026.2","13424"],["75026.7","5947"],["75027.6","20904"],["75027.7","4896"],["75028.7","5013"],["75028.8","18508"],["75029.8","16602"],["75029.9","4841"],["75030.6","5832"],["75030.8","12138"],["75031.5","3292"],["75032.1","2784"],["75033.2","5105"],["75033.5","3113"],["75033.9","35230"],["75035.3","15882"],["75035.5","10350"],["75036.7","32929"],["75037","16361"],["75037.2","7357"],["75038","4674"],["75038.2","47261"],["75039.8","3290"],["75040.7","12980"],["75040.8","4948"],["75041.5","5032"],["75043","32027"],["75044.2","2130"],["75045","3810"],["75045.5","20887"],["75045.9","3850"],["75050.3","10803"],["75050.8","12166"],["75052.6","3246"],["75053.4","2763"],["75054","5015"],["75054.2","2309"],["75056.7","18451"],["75058.9","5384"],["75059.5","1829"],["75059.6","3960"],["75060.5","31768"],["75063.4","24814"],["75063.6","3143"],["75064","11030"],["75065.1","17205"],["75066.9","6714"],["75068.9","3862"],["75070.1","11456"],["75073.2","5914"],["75074.1","4002"],["75074.8","10725"],["75075","13031"],["75079.8","1667"],["75080.8","2119"],["75082","9091"],["75084","21983"],["75085.9","2234"],["75086.9","5132"],["75088.4","39010"],["75088.6","13513"],["75092.9","3889"],["75095","4577"],["75095.7","17417"],["75096.7","3450"],["75096.8","80097"],["75100.4","14974"],["75101.1","1591"],["75101.7","27968"],["75102","4777"],["75103.7","22142"],["75107.7","4441"],["75113.6","16114"],["75113.8","4095"],["75114","37013"],["75115.8","3995"],["75117.3","3815"],["75118.7","2368"],["75118.8","3607"],["75124.1","36074"],["75128.3","16569"],["75129.4","10216"],["75130.3","4382"],["75130.6","3421"],["75133.3","15453"],["75134.3","12155"],["75142.6","3058"],["75146.3","2339"],["75146.7","2865"],["75146.9","3776"],["75150.7","5520"],["75154","2645"],["75154.1","15194"],["75154.8","1517"],["75155.2","14501"],["75163","29791"],["75168","9741"],["75170.8","32983"],["75175.6","3587"],["75177.4","32797"],["75177.6","14517"],["75179.7","2157"],["75180.8","3153"],["75183.9","3260"],["75185.6","1741"],["75187.8","20840"],["75188.7","7152"],["75190.6","4712"],["75192.6","26774"],["75198.8","3724"],["75202.6","45154"],["75206","3067"],["75209.9","3279"],["75211.9","4391"],["75212.1","3476"],["75212.2","5545"],["75213.7","5168"],["75215.5","4048"],["75219.5","28137"],["75224.1","17343"],["75227","18576"],["75227.9","2217"],["75228.4","8551"],["75229.8","9535"],["75233.2","2503"],["75241.8","2395"],["75242.5","19420"],["75244.3","4037"],["75249.4","3520"],["75253.8","3130"],["75260.4","24420"],["75262","17901"],["75266.3","4464"],["75270.9","12828"],["75273.6","3223"],["75281.4","4319"],["75284.5","6945"],["75291.3","65371"],["75291.7","4196"],["75294.7","21974"],["75298.7","60536"],["75301.3","41879"],["75302.8","19363"],["75304.6","4503"],["75305","34497"],["75305.4","13176"],["75307.2","5687"],["75315.6","2964"],["75316.3","4372"],["75316.5","2120"],["75317.8","3755"],["75318","3799"],["75322.1","3266"],["75326.4","5212"],["75335.9","30618"],["75337.4","8268"],["75344.9","8702"],["75345.6","45570"],["75346.7","2780"],["75350.5","5114"],["75363.8","4518"],["75366.3","3438"],["75368.8","58130"],["75380.9","35426"],["75386.7","13291"],["75399.2","6334"],["75401","5798"],["75401.5","7774"],["75401.6","14309"],["75402.2","28332"],["75402.3","2980"],["75409.9","2810"],["75411.2","1174"],["75411.9","16284"],["75418.4","5177"],["75420.4","50013"],["75423.6","5330"],["75424.6","3431"],["75425.3","2034"],["75428.2","7249"],["75429.7","9395"],["75431.6","9539"],["75432.2","12542"],["75435.3","18868"],["75436.7","24015"],["75439.8","4005"],["75445","10580"],["75447.7","2537"],["75461.9","4758"],["75466.6","1734"],["75467.2","2888"],["75468.3","5819"],["75471.9","4969"],["75480.7","19308"],["75485.4","5427"],["75490.1","2933"],["75490.3","3747"],["75491.1","2855"],["75492.1","35855"],["75505.3","2797"],["75506.3","3975"],["75512.7","3165"],["75514","3738"],["75519.9","1267"],["75521.8","7205"],["75521.9","23080"],["75523","4151"],["75525.6","14959"],["75525.8","5633"],["75528.9","19235"],["75535","4399"],["75542.1","9788"],["75546.6","2776"],["75547.7","4347"],["75557","19558"],["75557.6","2749"],["75561.2","19246"],["75569.2","20167"],["75569.9","10009"],["75576.4","17372"],["75587.8","17... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-19T18:04:12.644360" 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-04-19T18:04:12.644676" 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-04-19T18:04:12.428561" elapsed="0.216154"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:12.644882" elapsed="0.000117"/>
</return>
<msg time="2026-04-19T18:04:12.645309" 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-04-19T18:04:12.428176" elapsed="0.217169"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:12.647284" 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-04-19T18:04:12.646425" elapsed="0.000968"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:12.648276" 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-04-19T18:04:12.647576" elapsed="0.000740"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:12.648746" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:12.648525" elapsed="0.000295"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:12.645805" elapsed="0.003101"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:12.650368" 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-04-19T18:04:12.649067" elapsed="0.001407"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:12.651598" level="INFO">${data} = {'t': 1776593052597, 's': 'btc_usdt', 'u': 1423187495931, 'b': [['75023.4', '22468'], ['75023.3', '25324'], ['75023', '6751'], ['75022.6', '40458'], ['75022.5', '165304'], ['75022.4', '160940'], ['750...</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-04-19T18:04:12.650638" elapsed="0.000988"/>
</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-04-19T18:04:12.651741" elapsed="0.000134"/>
</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-04-19T18:04:12.651975" elapsed="0.000138"/>
</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-04-19T18:04:12.652217" 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-04-19T18:04:12.652430" elapsed="0.000118"/>
</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-04-19T18:04:12.652645" elapsed="0.000112"/>
</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-04-19T18:04:12.652864" elapsed="0.000533"/>
</kw>
<doc>验证期货U本位深度数据接口不同深度级别功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:12.422204" elapsed="0.231359"/>
</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-04-19T18:04:12.657824" 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-04-19T18:04:12.657132" elapsed="0.000724"/>
</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-04-19T18:04:12.658589" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:12.657998" elapsed="0.000645"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:12.657972" elapsed="0.000698"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:12.658707" elapsed="0.000040"/>
</return>
<msg time="2026-04-19T18:04:12.658911" 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-04-19T18:04:12.656206" elapsed="0.002731"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:12.931291" 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-04-19T18:04:12.931854" 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': 'Sun, 19 Apr 2026 10:04:12 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9996', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': 'b1cccc86a5e71d1ca1145b7d7a47246d', 'X-Transparent': '00-b1cccc86a5e71d1ca1145b7d7a47246d-2e4fec0095297de4-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': '9eeb1573cdc984ac-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1776593052832} 
 </msg>
<msg time="2026-04-19T18:04:12.932057" 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-04-19T18:04:12.932469" 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-04-19T18:04:12.659634" elapsed="0.272903"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:12.932792" elapsed="0.000167"/>
</return>
<msg time="2026-04-19T18:04:12.933365" 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-04-19T18:04:12.659113" elapsed="0.274307"/>
</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-04-19T18:04:12.933903" elapsed="0.003061"/>
</kw>
<doc>验证期货U本位深度数据接口错误处理（无效交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:12.653873" elapsed="0.283449"/>
</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-04-19T18:04:12.943640" 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-04-19T18:04:12.942678" elapsed="0.001003"/>
</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-04-19T18:04:12.944649" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:12.943902" elapsed="0.000826"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:12.943860" elapsed="0.000909"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:12.944827" elapsed="0.000039"/>
</return>
<msg time="2026-04-19T18:04:12.945087" 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-04-19T18:04:12.941465" elapsed="0.003656"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:13.152482" 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-04-19T18:04:13.152896" 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': 'Sun, 19 Apr 2026 10:04:13 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': 'af24fc54377cd2f68bd19f121436080a', 'X-Transparent': '00-af24fc54377cd2f68bd19f121436080a-8ebd93df73edb91e-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': '9eeb15759f5384ac-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1776593053114} 
 </msg>
<msg time="2026-04-19T18:04:13.153176" 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-04-19T18:04:13.153552" 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-04-19T18:04:12.945872" elapsed="0.207754"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:13.153847" elapsed="0.000150"/>
</return>
<msg time="2026-04-19T18:04:13.154382" 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-04-19T18:04:12.945350" elapsed="0.209092"/>
</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-04-19T18:04:13.154909" elapsed="0.003079"/>
</kw>
<doc>验证期货U本位深度数据接口参数验证（缺少symbol参数）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:12.937876" elapsed="0.220479"/>
</test>
<doc>期货U本位深度数据接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:11.101520" elapsed="2.057641"/>
</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-04-19T18:04:13.169278" 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-04-19T18:04:13.169060" elapsed="0.000257"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:13.169860" 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-04-19T18:04:13.169694" elapsed="0.000218"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:13.169440" 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-04-19T18:04:13.170110" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:13.169988" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:13.169404" elapsed="0.000769"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:13.171009" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:13.170898" elapsed="0.000155"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:13.171280" 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-04-19T18:04:13.171382" 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-04-19T18:04:13.171485" 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-04-19T18:04:13.171608" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:13.171725" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:13.171121" elapsed="0.000656"/>
</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-04-19T18:04:13.171957" 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-04-19T18:04:13.172077" 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-04-19T18:04:13.172196" 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-04-19T18:04:13.172314" 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-04-19T18:04:13.172433" 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-04-19T18:04:13.172554" 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-04-19T18:04:13.172670" 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-04-19T18:04:13.172789" elapsed="0.000072"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:13.172966" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:13.171806" elapsed="0.001210"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:13.173424" 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-04-19T18:04:13.173135" elapsed="0.000330"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:13.173796" 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-04-19T18:04:13.173573" elapsed="0.000262"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:13.174168" 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-04-19T18:04:13.173944" elapsed="0.000262"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:13.174524" 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-04-19T18:04:13.174315" elapsed="0.000242"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:13.174842" 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-04-19T18:04:13.174651" elapsed="0.000224"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:13.175168" 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-04-19T18:04:13.174968" elapsed="0.000233"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:13.175516" 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-04-19T18:04:13.175298" elapsed="0.000251"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:13.175845" 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-04-19T18:04:13.175643" elapsed="0.000236"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:13.176177" 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-04-19T18:04:13.175973" elapsed="0.000236"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:13.173041" elapsed="0.003199"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:13.171102" elapsed="0.005162"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:13.176492" 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-04-19T18:04:13.176351" elapsed="0.000180"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:13.176947" 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-04-19T18:04:13.176628" elapsed="0.000555"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:13.170564" elapsed="0.006685"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:13.177428" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:13.177349" elapsed="0.000115"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:13.168681" elapsed="0.008832"/>
</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-04-19T18:04:13.180440" 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-04-19T18:04:13.179706" elapsed="0.000762"/>
</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-04-19T18:04:13.181068" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:13.180586" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:13.180567" elapsed="0.000583"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:13.181183" elapsed="0.000031"/>
</return>
<msg time="2026-04-19T18:04:13.181369" 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-04-19T18:04:13.179047" elapsed="0.002343"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:13.794292" 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-04-19T18:04:13.794858" 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': 'Sun, 19 Apr 2026 10:04:13 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '35a1f8680afb202cfb7935bcb09392a7', 'X-Transparent': '00-35a1f8680afb202cfb7935bcb09392a7-19d9ed247952603f-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': '9eeb15798837cabc-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"symbol":"btc_usdt","fundingRate":-0.000452,"nextCollectionTime":1776596400000,"collectionInternal":1},"ts":1776593053755} 
 </msg>
<msg time="2026-04-19T18:04:13.795090" 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-04-19T18:04:13.795491" 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-04-19T18:04:13.181836" elapsed="0.613718"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:13.795803" elapsed="0.000133"/>
</return>
<msg time="2026-04-19T18:04:13.796360" 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-04-19T18:04:13.181518" elapsed="0.614898"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:13.799138" 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-04-19T18:04:13.797934" elapsed="0.001349"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:13.800581" 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-04-19T18:04:13.799547" elapsed="0.001088"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:13.801203" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:13.800883" elapsed="0.000414"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:13.797054" elapsed="0.004362"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:13.802674" 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-04-19T18:04:13.801653" elapsed="0.001092"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:13.803694" level="INFO">${data} = {'symbol': 'btc_usdt', 'fundingRate': -0.000452, 'nextCollectionTime': 1776596400000, '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-04-19T18:04:13.802926" elapsed="0.000811"/>
</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-04-19T18:04:13.803918" elapsed="0.000228"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>fundingRate</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:13.804318" elapsed="0.000211"/>
</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-04-19T18:04:13.804697" elapsed="0.000195"/>
</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-04-19T18:04:13.805061" elapsed="0.000193"/>
</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-04-19T18:04:13.805433" elapsed="0.000810"/>
</kw>
<doc>验证期货U本位资金费率接口功能（BTC/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:13.177595" elapsed="0.628906"/>
</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-04-19T18:04:13.811037" 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-04-19T18:04:13.810178" elapsed="0.000894"/>
</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-04-19T18:04:13.811909" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:13.811274" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:13.811234" elapsed="0.000819"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:13.812097" elapsed="0.000036"/>
</return>
<msg time="2026-04-19T18:04:13.812320" 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-04-19T18:04:13.809113" elapsed="0.003236"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:14.032501" 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-04-19T18:04:14.032925" 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': 'Sun, 19 Apr 2026 10:04:14 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', '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': '141.11.146.71', 'X-Real-IP': '141.11.146.71', 'X-Trace-ID': '4384dd88b5ab6a970f6bd96a18a15ae1', 'X-Transparent': '00-4384dd88b5ab6a970f6bd96a18a15ae1-fd46fe479aec2307-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', 'speculation-rules': '"/cdn-cgi/speculation"', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': '9eeb157b0b51cabc-HKG', 'Content-Encoding': 'gzip', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"symbol":"eth_usdt","fundingRate":0.000160000000000000,"nextCollectionTime":1776614400000,"collectionInternal":8},"ts":1776593053992} 
 </msg>
<msg time="2026-04-19T18:04:14.033124" 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-04-19T18:04:14.033513" 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-04-19T18:04:13.812972" elapsed="0.220609"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:14.033818" elapsed="0.000143"/>
</return>
<msg time="2026-04-19T18:04:14.035173" 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-04-19T18:04:13.812514" elapsed="0.222716"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.037916" 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-04-19T18:04:14.036704" elapsed="0.001364"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.039465" 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-04-19T18:04:14.038377" elapsed="0.001130"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.039922" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:14.039705" elapsed="0.000285"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:14.035837" elapsed="0.004248"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.041034" 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-04-19T18:04:14.040256" elapsed="0.000849"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.042042" level="INFO">${data} = {'symbol': 'eth_usdt', 'fundingRate': 0.00016, 'nextCollectionTime': 1776614400000, '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-04-19T18:04:14.041285" elapsed="0.000799"/>
</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-04-19T18:04:14.042260" elapsed="0.000217"/>
</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-04-19T18:04:14.042649" elapsed="0.000196"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${data}</arg>
<arg>nextCollectionTime</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:14.043005" elapsed="0.000192"/>
</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-04-19T18:04:14.043376" elapsed="0.000176"/>
</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-04-19T18:04:14.043682" elapsed="0.000728"/>
</kw>
<doc>验证期货U本位资金费率接口功能（ETH/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:13.806891" elapsed="0.237722"/>
</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-04-19T18:04:14.051775" 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-04-19T18:04:14.050868" 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-04-19T18:04:14.052728" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:14.052073" elapsed="0.000728"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:14.052036" elapsed="0.000804"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:14.052888" elapsed="0.000050"/>
</return>
<msg time="2026-04-19T18:04:14.053149" 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-04-19T18:04:14.049768" elapsed="0.003410"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:14.256490" 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-04-19T18:04:14.256918" 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': 'Sun, 19 Apr 2026 10:04:14 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '2cbced92953bbcd8410afd0e3de450ac', 'X-Transparent': '00-2cbced92953bbcd8410afd0e3de450ac-363f768ffe65a32d-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': '9eeb157c8f50cabc-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"symbol":"sol_usdt","fundingRate":-0.002625,"nextCollectionTime":1776614400000,"collectionInternal":8},"ts":1776593054218} 
 </msg>
<msg time="2026-04-19T18:04:14.257100" 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-04-19T18:04:14.257532" 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-04-19T18:04:14.053828" elapsed="0.203771"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:14.257856" elapsed="0.000162"/>
</return>
<msg time="2026-04-19T18:04:14.258422" 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-04-19T18:04:14.053369" elapsed="0.205108"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.261291" 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-04-19T18:04:14.260050" elapsed="0.001385"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.262732" 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-04-19T18:04:14.261700" elapsed="0.001085"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.263318" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:14.263031" elapsed="0.000377"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:14.259153" elapsed="0.004378"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.264787" 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-04-19T18:04:14.263765" elapsed="0.001114"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.265984" level="INFO">${data} = {'symbol': 'sol_usdt', 'fundingRate': -0.002625, 'nextCollectionTime': 1776614400000, '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-04-19T18:04:14.265108" elapsed="0.000918"/>
</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-04-19T18:04:14.266224" elapsed="0.000744"/>
</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-04-19T18:04:14.267144" elapsed="0.000194"/>
</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-04-19T18:04:14.267508" elapsed="0.000270"/>
</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-04-19T18:04:14.267947" elapsed="0.000190"/>
</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-04-19T18:04:14.268308" elapsed="0.000808"/>
</kw>
<doc>验证期货U本位资金费率接口功能（SOL/USDT）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:14.047577" elapsed="0.221803"/>
</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-04-19T18:04:14.274509" 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-04-19T18:04:14.273664" elapsed="0.000877"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:14.275346" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:14.274727" elapsed="0.000688"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:14.274687" elapsed="0.000768"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:14.275507" elapsed="0.000033"/>
</return>
<msg time="2026-04-19T18:04:14.275740" 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-04-19T18:04:14.272619" elapsed="0.003151"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:14.505201" 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-04-19T18:04:14.505657" 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': 'Sun, 19 Apr 2026 10:04:14 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '824a95acdf1582842ee4afae6fce9b3c', 'X-Transparent': '00-824a95acdf1582842ee4afae6fce9b3c-e34e9d316b614d91-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': '9eeb157deab6cabc-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1776593054445} 
 </msg>
<msg time="2026-04-19T18:04:14.505861" 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-04-19T18:04:14.506287" 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-04-19T18:04:14.276393" elapsed="0.229969"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:14.506638" elapsed="0.000183"/>
</return>
<msg time="2026-04-19T18:04:14.507267" 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-04-19T18:04:14.275939" elapsed="0.231388"/>
</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-04-19T18:04:14.507852" elapsed="0.003249"/>
</kw>
<doc>验证期货U本位资金费率接口错误处理（无效交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:14.269774" elapsed="0.241697"/>
</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-04-19T18:04:14.517817" 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-04-19T18:04:14.516826" elapsed="0.001031"/>
</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-04-19T18:04:14.518827" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:14.518126" elapsed="0.000797"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:14.518078" elapsed="0.000887"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:14.519022" elapsed="0.000049"/>
</return>
<msg time="2026-04-19T18:04:14.519305" 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-04-19T18:04:14.515653" elapsed="0.003685"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:14.721237" 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-04-19T18:04:14.721719" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/funding-rate 
 status=200, reason=OK 
 headers={'Date': 'Sun, 19 Apr 2026 10:04:14 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9997', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': 'f2ba0aeb1dcc80c496e5934838469a7d', 'X-Transparent': '00-f2ba0aeb1dcc80c496e5934838469a7d-57056cbd39d503a9-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': '9eeb157f6f25cabc-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1776593054684} 
 </msg>
<msg time="2026-04-19T18:04:14.721979" 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-04-19T18:04:14.722444" 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-04-19T18:04:14.520444" elapsed="0.202063"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:14.722758" elapsed="0.000166"/>
</return>
<msg time="2026-04-19T18:04:14.723354" 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-04-19T18:04:14.519561" elapsed="0.203849"/>
</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-04-19T18:04:14.723903" elapsed="0.003106"/>
</kw>
<doc>验证期货U本位资金费率接口参数验证（缺少symbol参数）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:14.512064" elapsed="0.215282"/>
</test>
<doc>期货U本位资金费率接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:13.161786" elapsed="1.566390"/>
</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-04-19T18:04:14.738011" 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-04-19T18:04:14.737741" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.738653" 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-04-19T18:04:14.738475" elapsed="0.000237"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:14.738184" elapsed="0.000570"/>
</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-04-19T18:04:14.738922" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:14.738798" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:14.738146" elapsed="0.000867"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.739835" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:14.739707" elapsed="0.000172"/>
</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-04-19T18:04:14.740140" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:14.740268" 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-04-19T18:04:14.740402" 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-04-19T18:04:14.740526" elapsed="0.000081"/>
</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-04-19T18:04:14.740716" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:14.739954" elapsed="0.000820"/>
</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-04-19T18:04:14.740952" 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-04-19T18:04:14.741073" 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-04-19T18:04:14.741197" 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-04-19T18:04:14.741315" 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-04-19T18:04:14.741438" 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-04-19T18:04:14.741572" 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-04-19T18:04:14.741699" 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-04-19T18:04:14.741819" 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-04-19T18:04:14.741947" elapsed="0.000242"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:14.740799" elapsed="0.001431"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.742623" 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-04-19T18:04:14.742357" elapsed="0.000308"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.743011" 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-04-19T18:04:14.742776" elapsed="0.000279"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.743403" 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-04-19T18:04:14.743181" elapsed="0.000255"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.743729" 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-04-19T18:04:14.743530" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.744061" 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-04-19T18:04:14.743862" elapsed="0.000232"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.744388" 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-04-19T18:04:14.744191" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.744747" 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-04-19T18:04:14.744517" elapsed="0.000263"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.745091" 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-04-19T18:04:14.744879" elapsed="0.000244"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.745422" 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-04-19T18:04:14.745219" elapsed="0.000237"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:14.742255" elapsed="0.003237"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:14.739935" elapsed="0.005580"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.745755" 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-04-19T18:04:14.745607" elapsed="0.000189"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:14.746267" 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-04-19T18:04:14.745901" elapsed="0.000598"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:14.739428" elapsed="0.007140"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:14.746749" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:14.746669" elapsed="0.000116"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:14.737365" elapsed="0.009468"/>
</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-04-19T18:04:14.749721" 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-04-19T18:04:14.749088" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:14.750376" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:14.749902" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:14.749883" elapsed="0.000565"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:14.750482" elapsed="0.000032"/>
</return>
<msg time="2026-04-19T18:04:14.750673" 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-04-19T18:04:14.748369" elapsed="0.002327"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:15.553187" 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-04-19T18:04:15.553634" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/index-price 
 status=200, reason=OK 
 headers={'Date': 'Sun, 19 Apr 2026 10:04:15 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': 'a46c8f9d19de9c4087de681764dcf346', 'X-Transparent': '00-a46c8f9d19de9c4087de681764dcf346-1de937dca22313aa-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': '9eeb1583fb3addbc-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":"2312.42","t":1776593055207},{"s":"sol_usdt","p":"84.64","t":1776593055209},{"s":"bnb_usdt","p":"599.36","t":1776061637754},{"s":"ordi_usdt","p":"2.256","t":1776061643383},{"s":"btc_usdt","p":"75061.3","t":1776593055206},{"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.09365","t":1776593055210},{"s":"raysol_usdt","p":"3.3966","t":1747980978061},{"s":"btx_usdt","p":"0.0445","t":1776061697756},{"s":"btc_usdc","p":"75074.0115","t":1776593055212},{"s":"xaut_usdt","p":"4703.4","t":1776061848683}],"ts":1776593055403} 
 </msg>
<msg time="2026-04-19T18:04:15.553832" 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-04-19T18:04:15.554264" 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-04-19T18:04:14.751843" elapsed="0.802496"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:15.554596" elapsed="0.000161"/>
</return>
<msg time="2026-04-19T18:04:15.555178" 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-04-19T18:04:14.750838" elapsed="0.804395"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.557981" 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-04-19T18:04:15.556784" elapsed="0.001343"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.559494" 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-04-19T18:04:15.558398" elapsed="0.001162"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.560121" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:15.559833" elapsed="0.000380"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:15.555883" elapsed="0.004452"/>
</kw>
<kw name="验证指数价格数据不为空">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.563184" 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-04-19T18:04:15.562129" elapsed="0.001128"/>
</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-04-19T18:04:15.563436" elapsed="0.000470"/>
</kw>
<arg>${response.json()}</arg>
<status status="PASS" start="2026-04-19T18:04:15.560684" elapsed="0.003314"/>
</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-04-19T18:04:15.565348" elapsed="0.000791"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.566532" 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-04-19T18:04:15.566318" elapsed="0.000281"/>
</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-04-19T18:04:15.567590" elapsed="0.000212"/>
</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-04-19T18:04:15.567941" elapsed="0.000176"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>t</arg>
<arg>指数价格项应该包含timestamp字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:15.568253" elapsed="0.000175"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.569504" 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-04-19T18:04:15.569343" elapsed="0.000215"/>
</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-04-19T18:04:15.569703" elapsed="0.000188"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:15.570030" elapsed="0.000455"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.568610" elapsed="0.001952"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.571536" 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-04-19T18:04:15.571370" elapsed="0.000215"/>
</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-04-19T18:04:15.571691" elapsed="0.000151"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:15.571962" elapsed="0.000310"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.570719" elapsed="0.001619"/>
</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-04-19T18:04:15.573142" elapsed="0.000242"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:15.573495" elapsed="0.000184"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.574012" 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-04-19T18:04:15.573796" elapsed="0.000243"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.574281" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:15.574351" 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-04-19T18:04:15.574164" elapsed="0.000211"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:15.574483" elapsed="0.000262"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.572497" elapsed="0.002311"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-04-19T18:04:15.567243" elapsed="0.007616"/>
</kw>
<var name="${index_price}">{'s': 'trb_usdt', 'p': '15.164', 't': 1776061641025}</var>
<status status="PASS" start="2026-04-19T18:04:15.567039" elapsed="0.007851"/>
</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-04-19T18:04:15.575353" 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-04-19T18:04:15.575601" 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-04-19T18:04:15.575841" elapsed="0.000134"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.576898" 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-04-19T18:04:15.576646" elapsed="0.000291"/>
</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-04-19T18:04:15.577028" elapsed="0.000122"/>
</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-04-19T18:04:15.577248" elapsed="0.000132"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.576092" elapsed="0.001342"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.578180" 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-04-19T18:04:15.578067" elapsed="0.000152"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-04-19T18:04:15.578315" 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-04-19T18:04:15.578615" elapsed="0.000181"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.577541" elapsed="0.001323"/>
</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-04-19T18:04:15.579530" elapsed="0.000186"/>
</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-04-19T18:04:15.579801" elapsed="0.000137"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.580173" 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-04-19T18:04:15.580029" elapsed="0.000164"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.580360" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:15.580414" 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-04-19T18:04:15.580278" elapsed="0.000156"/>
</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-04-19T18:04:15.580512" elapsed="0.000189"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.578997" elapsed="0.001750"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-04-19T18:04:15.575111" elapsed="0.005681"/>
</kw>
<var name="${index_price}">{'s': 'xrp_usdt', 'p': '1.8284', 't': 1744189287376}</var>
<status status="PASS" start="2026-04-19T18:04:15.574991" elapsed="0.005826"/>
</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-04-19T18:04:15.581214" elapsed="0.000121"/>
</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-04-19T18:04:15.581421" elapsed="0.000115"/>
</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-04-19T18:04:15.581623" elapsed="0.000111"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.582422" 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-04-19T18:04:15.582322" elapsed="0.000134"/>
</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-04-19T18:04:15.582535" elapsed="0.000114"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:15.582842" elapsed="0.000318"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.581838" elapsed="0.001428"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.584416" 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-04-19T18:04:15.584248" elapsed="0.000228"/>
</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-04-19T18:04:15.584599" elapsed="0.000165"/>
</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-04-19T18:04:15.584882" elapsed="0.000179"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.583456" elapsed="0.001673"/>
</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-04-19T18:04:15.585948" 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-04-19T18:04:15.586345" elapsed="0.000194"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.586818" level="INFO">${timestamp_str} = 1776593055207</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:15.586644" elapsed="0.000199"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.587056" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:15.587122" 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-04-19T18:04:15.586946" elapsed="0.000197"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:15.587239" elapsed="0.000218"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.585277" elapsed="0.002236"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-04-19T18:04:15.580995" elapsed="0.006561"/>
</kw>
<var name="${index_price}">{'s': 'eth_usdt', 'p': '2312.42', 't': 1776593055207}</var>
<status status="PASS" start="2026-04-19T18:04:15.580894" elapsed="0.006687"/>
</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-04-19T18:04:15.589436" 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-04-19T18:04:15.589689" elapsed="0.000145"/>
</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-04-19T18:04:15.589979" elapsed="0.000145"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.590941" 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-04-19T18:04:15.590813" elapsed="0.000169"/>
</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-04-19T18:04:15.591077" elapsed="0.000134"/>
</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-04-19T18:04:15.591313" elapsed="0.000140"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.590244" elapsed="0.001269"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.592284" 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-04-19T18:04:15.592157" elapsed="0.000171"/>
</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-04-19T18:04:15.592425" 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-04-19T18:04:15.592655" elapsed="0.000145"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.591625" elapsed="0.001232"/>
</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-04-19T18:04:15.593502" elapsed="0.000204"/>
</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-04-19T18:04:15.593805" elapsed="0.000160"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.594215" level="INFO">${timestamp_str} = 1776593055209</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:15.594065" elapsed="0.000170"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.594408" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:15.594463" 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-04-19T18:04:15.594317" elapsed="0.000163"/>
</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-04-19T18:04:15.594559" elapsed="0.000180"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.592975" elapsed="0.001810"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-04-19T18:04:15.587797" elapsed="0.007027"/>
</kw>
<var name="${index_price}">{'s': 'sol_usdt', 'p': '84.64', 't': 1776593055209}</var>
<status status="PASS" start="2026-04-19T18:04:15.587679" elapsed="0.007165"/>
</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-04-19T18:04:15.595224" elapsed="0.000119"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:15.595428" elapsed="0.000119"/>
</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-04-19T18:04:15.595632" elapsed="0.000124"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.596415" 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-04-19T18:04:15.596310" elapsed="0.000141"/>
</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-04-19T18:04:15.596532" elapsed="0.000118"/>
</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-04-19T18:04:15.596732" elapsed="0.000122"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.595856" elapsed="0.001045"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.597552" 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-04-19T18:04:15.597446" elapsed="0.000141"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-04-19T18:04:15.597670" elapsed="0.000113"/>
</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-04-19T18:04:15.597867" elapsed="0.000226"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.596994" elapsed="0.001148"/>
</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-04-19T18:04:15.598703" elapsed="0.000171"/>
</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-04-19T18:04:15.598960" elapsed="0.000134"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.599309" 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-04-19T18:04:15.599177" elapsed="0.000196"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.599546" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:15.599603" 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-04-19T18:04:15.599459" elapsed="0.000162"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:15.599702" elapsed="0.000174"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.598243" elapsed="0.001682"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-04-19T18:04:15.595014" elapsed="0.004947"/>
</kw>
<var name="${index_price}">{'s': 'bnb_usdt', 'p': '599.36', 't': 1776061637754}</var>
<status status="PASS" start="2026-04-19T18:04:15.594916" elapsed="0.005065"/>
</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-04-19T18:04:15.600370" elapsed="0.000128"/>
</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-04-19T18:04:15.600585" elapsed="0.000122"/>
</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-04-19T18:04:15.600793" elapsed="0.000120"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.601575" 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-04-19T18:04:15.601469" elapsed="0.000141"/>
</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-04-19T18:04:15.601689" elapsed="0.000113"/>
</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-04-19T18:04:15.601883" elapsed="0.000119"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.601015" elapsed="0.001035"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.602634" 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-04-19T18:04:15.602539" elapsed="0.000126"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-04-19T18:04:15.602741" 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-04-19T18:04:15.602915" elapsed="0.000109"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.602142" elapsed="0.000924"/>
</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-04-19T18:04:15.603553" elapsed="0.000144"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:15.603772" elapsed="0.000118"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.604080" 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-04-19T18:04:15.603964" elapsed="0.000134"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.604247" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:15.604296" 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-04-19T18:04:15.604172" elapsed="0.000140"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:15.604383" elapsed="0.000154"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.603156" elapsed="0.001421"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-04-19T18:04:15.600152" elapsed="0.004457"/>
</kw>
<var name="${index_price}">{'s': 'ordi_usdt', 'p': '2.256', 't': 1776061643383}</var>
<status status="PASS" start="2026-04-19T18:04:15.600051" elapsed="0.004576"/>
</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-04-19T18:04:15.604949" elapsed="0.000106"/>
</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-04-19T18:04:15.605130" elapsed="0.000106"/>
</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-04-19T18:04:15.605308" elapsed="0.000104"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.606079" 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-04-19T18:04:15.605986" elapsed="0.000127"/>
</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-04-19T18:04:15.606184" elapsed="0.000102"/>
</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-04-19T18:04:15.606358" elapsed="0.000109"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.605504" elapsed="0.001005"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.607111" 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-04-19T18:04:15.607017" elapsed="0.000125"/>
</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-04-19T18:04:15.607213" 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-04-19T18:04:15.607394" elapsed="0.000109"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.606613" elapsed="0.000932"/>
</kw>
<kw name="验证指数价格时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($timestamp, int)</arg>
<arg>指数价格时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:15.608034" elapsed="0.000144"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:15.608252" elapsed="0.000119"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.608564" level="INFO">${timestamp_str} = 1776593055206</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:15.608445" elapsed="0.000137"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.608733" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:15.608785" 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-04-19T18:04:15.608656" elapsed="0.000145"/>
</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-04-19T18:04:15.608871" elapsed="0.000152"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.607634" elapsed="0.001430"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-04-19T18:04:15.604766" elapsed="0.004330"/>
</kw>
<var name="${index_price}">{'s': 'btc_usdt', 'p': '75061.3', 't': 1776593055206}</var>
<status status="PASS" start="2026-04-19T18:04:15.604684" elapsed="0.004430"/>
</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-04-19T18:04:15.609451" elapsed="0.000120"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:15.609650" 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-04-19T18:04:15.609834" elapsed="0.000108"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.610478" 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-04-19T18:04:15.610393" elapsed="0.000113"/>
</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-04-19T18:04:15.610573" elapsed="0.000089"/>
</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-04-19T18:04:15.610735" elapsed="0.000095"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.610034" elapsed="0.000834"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.611384" 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-04-19T18:04:15.611298" elapsed="0.000114"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-04-19T18:04:15.611476" elapsed="0.000092"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:15.611634" elapsed="0.000101"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.610944" elapsed="0.000829"/>
</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-04-19T18:04:15.612212" 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-04-19T18:04:15.612406" elapsed="0.000106"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.612685" 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-04-19T18:04:15.612579" elapsed="0.000122"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.612836" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:15.612964" 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-04-19T18:04:15.612767" elapsed="0.000212"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:15.613043" elapsed="0.000141"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.611856" elapsed="0.001364"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-04-19T18:04:15.609258" elapsed="0.003992"/>
</kw>
<var name="${index_price}">{'s': '1000shib_usdt', 'p': '0.0058', 't': 1776061707972}</var>
<status status="PASS" start="2026-04-19T18:04:15.609175" elapsed="0.004091"/>
</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-04-19T18:04:15.613572" elapsed="0.000094"/>
</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-04-19T18:04:15.613741" elapsed="0.000096"/>
</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-04-19T18:04:15.613904" elapsed="0.000095"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.614472" 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-04-19T18:04:15.614395" elapsed="0.000102"/>
</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-04-19T18:04:15.614556" elapsed="0.000083"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:15.614700" elapsed="0.000091"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.614071" elapsed="0.000754"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.615291" 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-04-19T18:04:15.615214" elapsed="0.000102"/>
</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-04-19T18:04:15.615375" elapsed="0.000083"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:15.615519" elapsed="0.000090"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.614892" elapsed="0.000752"/>
</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-04-19T18:04:15.616041" 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-04-19T18:04:15.616218" elapsed="0.000096"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.616473" 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-04-19T18:04:15.616376" elapsed="0.000112"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.616611" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:15.616651" 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-04-19T18:04:15.616549" elapsed="0.000115"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:15.616722" elapsed="0.000125"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.615718" elapsed="0.001162"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-04-19T18:04:15.613391" elapsed="0.003515"/>
</kw>
<var name="${index_price}">{'s': 'ada_usdt', 'p': '0.2394', 't': 1776061663345}</var>
<status status="PASS" start="2026-04-19T18:04:15.613317" elapsed="0.003603"/>
</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-04-19T18:04:15.617186" 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-04-19T18:04:15.617338" 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-04-19T18:04:15.617485" elapsed="0.000086"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.618050" 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-04-19T18:04:15.617972" 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-04-19T18:04:15.618132" 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-04-19T18:04:15.618274" elapsed="0.000086"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.617644" elapsed="0.000750"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.618940" 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-04-19T18:04:15.618863" elapsed="0.000103"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-04-19T18:04:15.619023" elapsed="0.000083"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:15.619166" elapsed="0.000093"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.618461" elapsed="0.000832"/>
</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-04-19T18:04:15.619693" 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-04-19T18:04:15.619885" elapsed="0.000097"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.620141" 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-04-19T18:04:15.620045" elapsed="0.000110"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.620276" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:15.620314" 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-04-19T18:04:15.620214" elapsed="0.000113"/>
</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-04-19T18:04:15.620385" elapsed="0.000125"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.619366" elapsed="0.001177"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-04-19T18:04:15.617035" elapsed="0.003534"/>
</kw>
<var name="${index_price}">{'s': 'arb_usdt', 'p': '0.11', 't': 1776061665430}</var>
<status status="PASS" start="2026-04-19T18:04:15.616967" elapsed="0.003617"/>
</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-04-19T18:04:15.620847" elapsed="0.000086"/>
</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-04-19T18:04:15.620998" 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-04-19T18:04:15.621146" elapsed="0.000086"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.621706" 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-04-19T18:04:15.621627" 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-04-19T18:04:15.621789" 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-04-19T18:04:15.621931" elapsed="0.000080"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.621305" elapsed="0.000738"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.622484" 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-04-19T18:04:15.622412" elapsed="0.000095"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-04-19T18:04:15.622561" elapsed="0.000078"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:15.622696" elapsed="0.000086"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.622105" elapsed="0.000709"/>
</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-04-19T18:04:15.623182" elapsed="0.000106"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:15.623347" elapsed="0.000089"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.623578" level="INFO">${timestamp_str} = 1776593055210</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:15.623491" elapsed="0.000101"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.623702" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:15.623738" 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-04-19T18:04:15.623646" elapsed="0.000105"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:15.623804" elapsed="0.000112"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.622881" elapsed="0.001065"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-04-19T18:04:15.620697" elapsed="0.003273"/>
</kw>
<var name="${index_price}">{'s': 'doge_usdt', 'p': '0.09365', 't': 1776593055210}</var>
<status status="PASS" start="2026-04-19T18:04:15.620630" elapsed="0.003354"/>
</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-04-19T18:04:15.624228" elapsed="0.000080"/>
</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-04-19T18:04:15.624365" 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-04-19T18:04:15.624500" elapsed="0.000144"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.625088" 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-04-19T18:04:15.625016" 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-04-19T18:04:15.625165" elapsed="0.000076"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[a-z0-9]+_[a-z]+$</arg>
<arg>指数价格符号格式应该正确</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:15.625311" elapsed="0.000081"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.624713" elapsed="0.000710"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.625859" 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-04-19T18:04:15.625786" elapsed="0.000095"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-04-19T18:04:15.625932" elapsed="0.000072"/>
</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-04-19T18:04:15.626057" elapsed="0.000076"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.625485" elapsed="0.000679"/>
</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-04-19T18:04:15.626512" elapsed="0.000100"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:15.626665" elapsed="0.000088"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.626891" 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-04-19T18:04:15.626807" elapsed="0.000096"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.627010" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:15.627045" 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-04-19T18:04:15.626955" elapsed="0.000102"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:15.627108" elapsed="0.000108"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.626227" elapsed="0.001018"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-04-19T18:04:15.624090" elapsed="0.003177"/>
</kw>
<var name="${index_price}">{'s': 'raysol_usdt', 'p': '3.3966', 't': 1747980978061}</var>
<status status="PASS" start="2026-04-19T18:04:15.624027" elapsed="0.003253"/>
</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-04-19T18:04:15.627512" 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-04-19T18:04:15.627640" 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-04-19T18:04:15.627768" elapsed="0.000075"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.628261" 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-04-19T18:04:15.628194" 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-04-19T18:04:15.628334" elapsed="0.000071"/>
</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-04-19T18:04:15.628458" elapsed="0.000074"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.627909" elapsed="0.000653"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.628972" 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-04-19T18:04:15.628904" elapsed="0.000090"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-04-19T18:04:15.629044" 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-04-19T18:04:15.629167" elapsed="0.000078"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.628620" elapsed="0.000654"/>
</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-04-19T18:04:15.629625" elapsed="0.000161"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:15.629840" elapsed="0.000081"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.630052" 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-04-19T18:04:15.629972" elapsed="0.000092"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.630165" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:15.630198" 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-04-19T18:04:15.630113" 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-04-19T18:04:15.630256" elapsed="0.000103"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.629338" elapsed="0.001060"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-04-19T18:04:15.627381" elapsed="0.003039"/>
</kw>
<var name="${index_price}">{'s': 'btx_usdt', 'p': '0.0445', 't': 1776061697756}</var>
<status status="PASS" start="2026-04-19T18:04:15.627323" elapsed="0.003110"/>
</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-04-19T18:04:15.630650" elapsed="0.000072"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:15.630774" elapsed="0.000072"/>
</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-04-19T18:04:15.630896" elapsed="0.000072"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.631360" 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-04-19T18:04:15.631295" elapsed="0.000085"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-04-19T18:04:15.631428" 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-04-19T18:04:15.631547" elapsed="0.000071"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.631027" elapsed="0.000620"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.632037" 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-04-19T18:04:15.631972" elapsed="0.000090"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>指数价格价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-04-19T18:04:15.632111" elapsed="0.000067"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>指数价格价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:15.632231" elapsed="0.000075"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.631702" elapsed="0.000633"/>
</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-04-19T18:04:15.632695" 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-04-19T18:04:15.632857" elapsed="0.000081"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.633066" level="INFO">${timestamp_str} = 1776593055212</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:15.632988" elapsed="0.000089"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.633178" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:15.633211" 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-04-19T18:04:15.633127" 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-04-19T18:04:15.633270" elapsed="0.000101"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.632395" elapsed="0.001003"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-04-19T18:04:15.630527" elapsed="0.002892"/>
</kw>
<var name="${index_price}">{'s': 'btc_usdc', 'p': '75074.0115', 't': 1776593055212}</var>
<status status="PASS" start="2026-04-19T18:04:15.630471" elapsed="0.002960"/>
</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-04-19T18:04:15.633651" elapsed="0.000070"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${index_price}</arg>
<arg>p</arg>
<arg>指数价格项应该包含price字段</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:15.633770" 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-04-19T18:04:15.633887" elapsed="0.000068"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.634330" 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-04-19T18:04:15.634270" elapsed="0.000080"/>
</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-04-19T18:04:15.634396" 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-04-19T18:04:15.634508" elapsed="0.000121"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.634012" elapsed="0.000644"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.635031" 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-04-19T18:04:15.634969" 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-04-19T18:04:15.635098" elapsed="0.000065"/>
</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-04-19T18:04:15.635212" elapsed="0.000071"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.634709" elapsed="0.000613"/>
</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-04-19T18:04:15.635639" elapsed="0.000091"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>指数价格时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:15.635779" elapsed="0.000075"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.635978" level="INFO">${timestamp_str} = 1776061848683</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:15.635902" elapsed="0.000087"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.636085" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:15.636116" 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-04-19T18:04:15.636035" elapsed="0.000092"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:15.636172" elapsed="0.000098"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.635379" elapsed="0.000917"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-04-19T18:04:15.633524" elapsed="0.002793"/>
</kw>
<var name="${index_price}">{'s': 'xaut_usdt', 'p': '4703.4', 't': 1776061848683}</var>
<status status="PASS" start="2026-04-19T18:04:15.633469" elapsed="0.002860"/>
</iter>
<var>${index_price}</var>
<value>@{index_price_list}</value>
<status status="PASS" start="2026-04-19T18:04:15.566743" elapsed="0.069598"/>
</for>
<arg>${response.json()['data']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.564389" elapsed="0.071977"/>
</kw>
<doc>测试获取所有期货U本位指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:14.746909" elapsed="0.889520"/>
</test>
<test id="s1-s2-s2-s3-t2" name="获取期货U本位单个指数价格" line="16">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.637252" 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-04-19T18:04:15.637169" elapsed="0.000096"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.637991" 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-04-19T18:04:15.637697" elapsed="0.000307"/>
</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-04-19T18:04:15.638294" elapsed="0.000009"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:15.638062" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:15.638052" elapsed="0.000279"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:15.638346" elapsed="0.000015"/>
</return>
<msg time="2026-04-19T18:04:15.638436" 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-04-19T18:04:15.637357" elapsed="0.001090"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:15.838151" 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-04-19T18:04:15.838520" 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': 'Sun, 19 Apr 2026 10:04:15 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '3eb385f1d6a866a73f9f7d71923c60f6', 'X-Transparent': '00-3eb385f1d6a866a73f9f7d71923c60f6-0fc14e46832c26fb-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': '9eeb15866918ddbc-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":[{"s":"btc_usdt","p":"75061.3","t":1776593055206}],"ts":1776593055796} 
 </msg>
<msg time="2026-04-19T18:04:15.838682" 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-04-19T18:04:15.839071" 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-04-19T18:04:15.638695" elapsed="0.200438"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:15.839417" elapsed="0.000108"/>
</return>
<msg time="2026-04-19T18:04:15.839871" 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-04-19T18:04:15.638510" elapsed="0.201419"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.842448" 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-04-19T18:04:15.841242" elapsed="0.001388"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.844067" 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-04-19T18:04:15.842964" elapsed="0.001164"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.844706" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:15.844398" elapsed="0.000410"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:15.840444" elapsed="0.004507"/>
</kw>
<kw name="验证指数价格数据不为空">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.847685" 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-04-19T18:04:15.846841" elapsed="0.000937"/>
</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-04-19T18:04:15.847988" elapsed="0.000463"/>
</kw>
<arg>${response.json()}</arg>
<status status="PASS" start="2026-04-19T18:04:15.845309" elapsed="0.003247"/>
</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-04-19T18:04:15.849888" elapsed="0.000356"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.851050" 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-04-19T18:04:15.850417" elapsed="0.000692"/>
</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-04-19T18:04:15.851959" elapsed="0.000208"/>
</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-04-19T18:04:15.852299" elapsed="0.000183"/>
</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-04-19T18:04:15.852616" elapsed="0.000180"/>
</kw>
<kw name="验证指数价格符号格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.854044" 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-04-19T18:04:15.853859" elapsed="0.000243"/>
</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-04-19T18:04:15.854237" elapsed="0.000178"/>
</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-04-19T18:04:15.854574" elapsed="0.000176"/>
</kw>
<arg>${index_price['s']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.852972" elapsed="0.001859"/>
</kw>
<kw name="验证指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.855888" 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-04-19T18:04:15.855716" elapsed="0.000225"/>
</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-04-19T18:04:15.856057" elapsed="0.000145"/>
</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-04-19T18:04:15.856310" elapsed="0.000176"/>
</kw>
<arg>${index_price['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.854987" elapsed="0.001584"/>
</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-04-19T18:04:15.857698" elapsed="0.000367"/>
</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-04-19T18:04:15.858196" elapsed="0.000203"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.858731" level="INFO">${timestamp_str} = 1776593055206</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:15.858520" elapsed="0.000237"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.858969" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:15.859033" 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-04-19T18:04:15.858863" elapsed="0.000191"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>指数价格时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:15.859147" elapsed="0.000217"/>
</kw>
<arg>${index_price['t']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.856833" elapsed="0.002591"/>
</kw>
<arg>${index_price}</arg>
<status status="PASS" start="2026-04-19T18:04:15.851606" elapsed="0.007875"/>
</kw>
<var name="${index_price}">{'s': 'btc_usdt', 'p': '75061.3', 't': 1776593055206}</var>
<status status="PASS" start="2026-04-19T18:04:15.851424" elapsed="0.008253"/>
</iter>
<var>${index_price}</var>
<value>@{index_price_list}</value>
<status status="PASS" start="2026-04-19T18:04:15.851198" elapsed="0.008530"/>
</for>
<arg>${response.json()['data']}</arg>
<status status="PASS" start="2026-04-19T18:04:15.848851" elapsed="0.010950"/>
</kw>
<kw name="验证单个指数价格符号">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.860886" level="INFO">Length is 1.</msg>
<msg time="2026-04-19T18:04:15.860970" 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-04-19T18:04:15.860768" elapsed="0.000224"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.861263" 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-04-19T18:04:15.861103" elapsed="0.000220"/>
</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-04-19T18:04:15.861450" elapsed="0.000546"/>
</kw>
<arg>${response.json()['data']}</arg>
<arg>btc_usdt</arg>
<status status="PASS" start="2026-04-19T18:04:15.859982" elapsed="0.002082"/>
</kw>
<doc>测试获取单个期货U本位指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:15.636528" elapsed="0.225710"/>
</test>
<test id="s1-s2-s2-s3-t3" name="获取期货U本位符号指数价格_BTC" line="27">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.864108" 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-04-19T18:04:15.863925" elapsed="0.000206"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:15.865626" 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-04-19T18:04:15.865042" elapsed="0.000611"/>
</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-04-19T18:04:15.866363" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:15.865793" elapsed="0.000666"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:15.865763" elapsed="0.000727"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:15.866531" elapsed="0.000039"/>
</return>
<msg time="2026-04-19T18:04:15.866786" 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-04-19T18:04:15.864360" elapsed="0.002456"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:16.077359" 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-04-19T18:04:16.077634" 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': 'Sun, 19 Apr 2026 10:04:16 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': 'f3c43bb36543e7048ddfc1e585aeaa86', 'X-Transparent': '00-f3c43bb36543e7048ddfc1e585aeaa86-126826df726180c4-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': '9eeb1587dbf2ddbc-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"btc_usdt","p":"75061.3","t":1776593055206},"ts":1776593056026} 
 </msg>
<msg time="2026-04-19T18:04:16.077753" 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-04-19T18:04:16.078051" 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-04-19T18:04:15.867461" elapsed="0.210629"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:16.078243" elapsed="0.000093"/>
</return>
<msg time="2026-04-19T18:04:16.078580" 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-04-19T18:04:15.866991" elapsed="0.211620"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.080497" 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-04-19T18:04:16.079732" elapsed="0.000863"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.081375" 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-04-19T18:04:16.080758" elapsed="0.000654"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.081761" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:16.081574" elapsed="0.000242"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:16.079107" elapsed="0.002788"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.082691" level="INFO">${data} = {'s': 'btc_usdt', 'p': '75061.3', 't': 1776593055206}</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-04-19T18:04:16.082035" elapsed="0.000689"/>
</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-04-19T18:04:16.083290" elapsed="0.000215"/>
</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-04-19T18:04:16.083629" elapsed="0.000170"/>
</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-04-19T18:04:16.083924" elapsed="0.000177"/>
</kw>
<arg>${data}</arg>
<status status="PASS" start="2026-04-19T18:04:16.082949" elapsed="0.001221"/>
</kw>
<kw name="验证符号指数价格符号">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.085281" 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-04-19T18:04:16.085125" elapsed="0.000200"/>
</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-04-19T18:04:16.085432" elapsed="0.000147"/>
</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-04-19T18:04:16.085686" elapsed="0.000200"/>
</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-04-19T18:04:16.085993" elapsed="0.000153"/>
</kw>
<arg>${data['s']}</arg>
<arg>btc_usdt</arg>
<status status="PASS" start="2026-04-19T18:04:16.084344" elapsed="0.001864"/>
</kw>
<kw name="验证符号指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.087172" 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-04-19T18:04:16.087031" elapsed="0.000190"/>
</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-04-19T18:04:16.087320" 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-04-19T18:04:16.087553" elapsed="0.000163"/>
</kw>
<arg>${data['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:16.086360" elapsed="0.001417"/>
</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-04-19T18:04:16.087880" elapsed="0.000551"/>
</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-04-19T18:04:16.088555" elapsed="0.000281"/>
</kw>
<doc>测试获取BTC期货U本位符号指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:15.862549" elapsed="0.226470"/>
</test>
<test id="s1-s2-s2-s3-t4" name="获取期货U本位符号指数价格_ETH" line="41">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.091442" 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-04-19T18:04:16.091150" elapsed="0.000332"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.093673" 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-04-19T18:04:16.092805" elapsed="0.000906"/>
</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-04-19T18:04:16.094557" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:16.093900" elapsed="0.000729"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:16.093858" elapsed="0.000808"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:16.094716" elapsed="0.000061"/>
</return>
<msg time="2026-04-19T18:04:16.095073" 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-04-19T18:04:16.091800" elapsed="0.003296"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:16.293257" 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-04-19T18:04:16.293625" 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': 'Sun, 19 Apr 2026 10:04:16 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '9bb724969d6e418d6a22dc55a2ef03cc', 'X-Transparent': '00-9bb724969d6e418d6a22dc55a2ef03cc-af85c89907e4ead4-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': '9eeb15894ef8ddbc-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"eth_usdt","p":"2312.42","t":1776593056221},"ts":1776593056255} 
 </msg>
<msg time="2026-04-19T18:04:16.293784" 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-04-19T18:04:16.294144" 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-04-19T18:04:16.096143" elapsed="0.198050"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:16.294409" elapsed="0.000135"/>
</return>
<msg time="2026-04-19T18:04:16.294863" 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-04-19T18:04:16.095271" elapsed="0.199632"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.296862" 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-04-19T18:04:16.296141" elapsed="0.000795"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.297617" 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-04-19T18:04:16.297104" elapsed="0.000550"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.298001" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:16.297816" elapsed="0.000243"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:16.295423" elapsed="0.002714"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.298955" level="INFO">${data} = {'s': 'eth_usdt', 'p': '2312.42', 't': 1776593056221}</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-04-19T18:04:16.298287" elapsed="0.000701"/>
</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-04-19T18:04:16.299591" elapsed="0.000227"/>
</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-04-19T18:04:16.299956" elapsed="0.000184"/>
</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-04-19T18:04:16.300260" elapsed="0.000150"/>
</kw>
<arg>${data}</arg>
<status status="PASS" start="2026-04-19T18:04:16.299231" elapsed="0.001247"/>
</kw>
<kw name="验证符号指数价格符号">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.301519" 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-04-19T18:04:16.301351" elapsed="0.000219"/>
</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-04-19T18:04:16.301690" elapsed="0.000163"/>
</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-04-19T18:04:16.301993" elapsed="0.000220"/>
</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-04-19T18:04:16.302338" elapsed="0.000160"/>
</kw>
<arg>${data['s']}</arg>
<arg>eth_usdt</arg>
<status status="PASS" start="2026-04-19T18:04:16.300635" elapsed="0.001927"/>
</kw>
<kw name="验证符号指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.303580" 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-04-19T18:04:16.303438" elapsed="0.000190"/>
</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-04-19T18:04:16.303801" elapsed="0.000145"/>
</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-04-19T18:04:16.304056" elapsed="0.000172"/>
</kw>
<arg>${data['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:16.302736" elapsed="0.001556"/>
</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-04-19T18:04:16.304402" elapsed="0.000531"/>
</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-04-19T18:04:16.305037" elapsed="0.000270"/>
</kw>
<doc>测试获取ETH期货U本位符号指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:16.089312" elapsed="0.216193"/>
</test>
<test id="s1-s2-s2-s3-t5" name="获取期货U本位符号指数价格_SOL" line="55">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.307664" 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-04-19T18:04:16.307424" elapsed="0.000270"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.309250" 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-04-19T18:04:16.308670" elapsed="0.000604"/>
</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-04-19T18:04:16.309902" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:16.309423" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:16.309387" elapsed="0.000594"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:16.310028" elapsed="0.000039"/>
</return>
<msg time="2026-04-19T18:04:16.310211" 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-04-19T18:04:16.307942" elapsed="0.002290"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:16.601241" 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-04-19T18:04:16.601676" 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': 'Sun, 19 Apr 2026 10:04:16 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9997', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '5deb7345aa74e81283c91fe616d0d162', 'X-Transparent': '00-5deb7345aa74e81283c91fe616d0d162-61448822c0b80790-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': '9eeb158aa9dbddbc-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"sol_usdt","p":"84.64","t":1776593056222},"ts":1776593056471} 
 </msg>
<msg time="2026-04-19T18:04:16.601863" 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-04-19T18:04:16.602301" 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-04-19T18:04:16.311003" elapsed="0.291370"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:16.602636" elapsed="0.000132"/>
</return>
<msg time="2026-04-19T18:04:16.603097" 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-04-19T18:04:16.310365" elapsed="0.292775"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.605443" 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-04-19T18:04:16.604413" elapsed="0.001152"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.606638" 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-04-19T18:04:16.605790" elapsed="0.000981"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.607168" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:16.606969" elapsed="0.000259"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:16.603655" elapsed="0.003652"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.608158" level="INFO">${data} = {'s': 'sol_usdt', 'p': '84.64', 't': 1776593056222}</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-04-19T18:04:16.607453" elapsed="0.000737"/>
</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-04-19T18:04:16.608804" elapsed="0.000245"/>
</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-04-19T18:04:16.609189" elapsed="0.000194"/>
</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-04-19T18:04:16.609520" elapsed="0.000177"/>
</kw>
<arg>${data}</arg>
<status status="PASS" start="2026-04-19T18:04:16.608436" elapsed="0.001339"/>
</kw>
<kw name="验证符号指数价格符号">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.610888" 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-04-19T18:04:16.610733" elapsed="0.000204"/>
</kw>
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>符号指数价格符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-04-19T18:04:16.611047" elapsed="0.000155"/>
</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-04-19T18:04:16.611322" elapsed="0.000234"/>
</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-04-19T18:04:16.611683" elapsed="0.000177"/>
</kw>
<arg>${data['s']}</arg>
<arg>sol_usdt</arg>
<status status="PASS" start="2026-04-19T18:04:16.609950" elapsed="0.001985"/>
</kw>
<kw name="验证符号指数价格价格格式">
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.612955" 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-04-19T18:04:16.612812" elapsed="0.000193"/>
</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-04-19T18:04:16.613109" elapsed="0.000148"/>
</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-04-19T18:04:16.613372" elapsed="0.000172"/>
</kw>
<arg>${data['p']}</arg>
<status status="PASS" start="2026-04-19T18:04:16.612096" elapsed="0.001520"/>
</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-04-19T18:04:16.613733" elapsed="0.000617"/>
</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-04-19T18:04:16.614459" elapsed="0.000293"/>
</kw>
<doc>测试获取SOL期货U本位符号指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:16.305812" elapsed="0.309125"/>
</test>
<test id="s1-s2-s2-s3-t6" name="获取期货U本位符号指数价格_无效交易对" line="69">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.617416" 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-04-19T18:04:16.617168" elapsed="0.000275"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.619050" 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-04-19T18:04:16.618472" elapsed="0.000604"/>
</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-04-19T18:04:16.619706" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:16.619220" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:16.619191" elapsed="0.000594"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:16.619820" elapsed="0.000039"/>
</return>
<msg time="2026-04-19T18:04:16.620002" 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-04-19T18:04:16.617697" elapsed="0.002326"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:16.823659" 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-04-19T18:04:16.824247" 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': 'Sun, 19 Apr 2026 10:04:16 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9996', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': 'c380af4ee6fb2b077b2720d95ab6c5b8', 'X-Transparent': '00-c380af4ee6fb2b077b2720d95ab6c5b8-5c326bc650e48a76-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': '9eeb158c9ddeddbc-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1776593056786} 
 </msg>
<msg time="2026-04-19T18:04:16.824502" 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-04-19T18:04:16.824897" 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-04-19T18:04:16.622647" elapsed="0.202320"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:16.825208" elapsed="0.000148"/>
</return>
<msg time="2026-04-19T18:04:16.825768" 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-04-19T18:04:16.620165" elapsed="0.205660"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.827764" 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-04-19T18:04:16.826273" elapsed="0.001630"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.829408" level="INFO">${response_data} = {'code': 1, 'msg': 'failure', 'msgInfo': {'code': 'invalid_symbol', 'template': '无效交易对', 'args': []}, 'data': None, 'ts': 1776593056786}</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-04-19T18:04:16.828207" elapsed="0.001263"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:16.830881" 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-04-19T18:04:16.829759" elapsed="0.001240"/>
</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-04-19T18:04:16.831264" elapsed="0.000969"/>
</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-04-19T18:04:16.832421" elapsed="0.000815"/>
</kw>
<doc>测试获取无效交易对的符号指数价格</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:16.615246" elapsed="0.218280"/>
</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-04-19T18:04:16.839075" 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-04-19T18:04:16.838092" elapsed="0.001022"/>
</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-04-19T18:04:16.840046" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:16.839342" elapsed="0.000772"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:16.839292" elapsed="0.000857"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:16.840196" elapsed="0.000039"/>
</return>
<msg time="2026-04-19T18:04:16.840439" 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-04-19T18:04:16.836992" elapsed="0.003477"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:17.127605" 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-04-19T18:04:17.128156" 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': 'Sun, 19 Apr 2026 10:04:17 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9995', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '674523317cc920610d1362f082ea0dc5', 'X-Transparent': '00-674523317cc920610d1362f082ea0dc5-6350db4b401d713c-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.008', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': '9eeb158df926ddbc-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1776593057000} 
 </msg>
<msg time="2026-04-19T18:04:17.128349" 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-04-19T18:04:17.128737" 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-04-19T18:04:16.841483" elapsed="0.287318"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:17.129048" elapsed="0.000166"/>
</return>
<msg time="2026-04-19T18:04:17.129628" 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-04-19T18:04:16.840657" elapsed="0.289027"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.131636" 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-04-19T18:04:17.130184" elapsed="0.001603"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.133366" level="INFO">${response_data} = {'code': 1, 'msg': 'failure', 'msgInfo': {'code': 'invalid_symbol', 'template': '无效交易对', 'args': ['symbol']}, 'data': None, 'ts': 1776593057000}</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-04-19T18:04:17.132121" elapsed="0.001310"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.134763" 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-04-19T18:04:17.133688" elapsed="0.001193"/>
</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-04-19T18:04:17.135152" elapsed="0.000823"/>
</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-04-19T18:04:17.136170" elapsed="0.000804"/>
</kw>
<doc>测试缺少symbol参数的符号指数价格请求</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:16.834002" elapsed="0.303255"/>
</test>
<doc>期货U本位指数价格接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:14.730901" elapsed="2.407083"/>
</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-04-19T18:04:17.146157" 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-04-19T18:04:17.145924" elapsed="0.000264"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.146701" 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-04-19T18:04:17.146561" elapsed="0.000188"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:17.146303" elapsed="0.000482"/>
</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-04-19T18:04:17.146920" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:17.146817" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:17.146271" elapsed="0.000721"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.147647" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:17.147545" elapsed="0.000144"/>
</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-04-19T18:04:17.147916" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:17.148029" 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-04-19T18:04:17.148137" 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-04-19T18:04:17.148256" 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-04-19T18:04:17.148399" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:17.147756" elapsed="0.000689"/>
</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-04-19T18:04:17.148600" 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-04-19T18:04:17.148710" 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-04-19T18:04:17.148814" elapsed="0.000024"/>
</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-04-19T18:04:17.148929" 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-04-19T18:04:17.149030" 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-04-19T18:04:17.149133" 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-04-19T18:04:17.149238" 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-04-19T18:04:17.149339" 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-04-19T18:04:17.149445" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:17.148467" elapsed="0.001026"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.149861" 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-04-19T18:04:17.149618" elapsed="0.000279"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.150189" 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-04-19T18:04:17.149990" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.150513" 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-04-19T18:04:17.150318" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.150829" 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-04-19T18:04:17.150639" elapsed="0.000229"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.151528" 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-04-19T18:04:17.151156" elapsed="0.000436"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.152001" 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-04-19T18:04:17.151739" elapsed="0.000308"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.152430" 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-04-19T18:04:17.152171" elapsed="0.000305"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.152849" 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-04-19T18:04:17.152598" elapsed="0.000295"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.153270" 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-04-19T18:04:17.153014" elapsed="0.000299"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:17.149514" elapsed="0.003843"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:17.147738" elapsed="0.005652"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.153720" 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-04-19T18:04:17.153509" elapsed="0.000266"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:17.154257" 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-04-19T18:04:17.153907" elapsed="0.000560"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:17.147304" elapsed="0.007246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.154778" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:17.154674" elapsed="0.000152"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:17.145610" elapsed="0.009276"/>
</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-04-19T18:04:17.158292" 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-04-19T18:04:17.157520" elapsed="0.000866"/>
</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-04-19T18:04:17.159156" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:17.158552" elapsed="0.000672"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:17.158522" elapsed="0.000725"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:17.159280" elapsed="0.000031"/>
</return>
<msg time="2026-04-19T18:04:17.159488" 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-04-19T18:04:17.156576" elapsed="0.002936"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:17.986433" 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-04-19T18:04:17.986853" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/mark-price 
 status=200, reason=OK 
 headers={'Date': 'Sun, 19 Apr 2026 10:04:17 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': 'e25404497fe83e26773177ee4da657d0', 'X-Transparent': '00-e25404497fe83e26773177ee4da657d0-8f1c4d4bd9c2c425-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': '9eeb1593ce3804fb-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":"3600","t":1776593057250},{"s":"sol_usdt","p":"84.46","t":1776593057240},{"s":"bnb_usdt","p":"2085","t":1776593057250},{"s":"ordi_usdt","p":"2.256","t":1776061643383},{"s":"btc_usdt","p":"75023.5","t":1776593057236},{"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.09362","t":1776593057243},{"s":"raysol_usdt","p":"3.3966","t":1747980978061},{"s":"btx_usdt","p":"0.0445","t":1776061697756},{"s":"btc_usdc","p":"75074.0115","t":1776593057245},{"s":"xaut_usdt","p":"4703.4","t":1776061848683}],"ts":1776593057942} 
 </msg>
<msg time="2026-04-19T18:04:17.987089" 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-04-19T18:04:17.987528" 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-04-19T18:04:17.160525" elapsed="0.827067"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:17.987848" elapsed="0.000157"/>
</return>
<msg time="2026-04-19T18:04:17.988415" 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-04-19T18:04:17.159666" elapsed="0.828808"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.991209" 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-04-19T18:04:17.989971" elapsed="0.001389"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.992767" 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-04-19T18:04:17.991655" elapsed="0.001169"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.993388" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:17.993088" elapsed="0.000392"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:17.989098" elapsed="0.004515"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:17.995058" level="INFO">${data} = [{'s': 'trb_usdt', 'p': '44.994', 't': 1776061641025}, {'s': 'xrp_usdt', 'p': '1.8795', 't': 1744189287376}, {'s': 'eth_usdt', 'p': '3600', 't': 1776593057250}, {'s': 'sol_usdt', 'p': '84.46', 't': 17...</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-04-19T18:04:17.993858" elapsed="0.001251"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.995595" 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-04-19T18:04:17.995311" elapsed="0.000352"/>
</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-04-19T18:04:17.995952" elapsed="0.000446"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:17.996740" level="INFO">Length is 15.</msg>
<msg time="2026-04-19T18:04:17.996853" 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-04-19T18:04:17.996576" elapsed="0.000312"/>
</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-04-19T18:04:17.997060" elapsed="0.000257"/>
</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-04-19T18:04:17.998983" elapsed="0.000292"/>
</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-04-19T18:04:17.999418" elapsed="0.000220"/>
</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-04-19T18:04:17.999772" elapsed="0.000195"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-19T18:04:18.000094" elapsed="0.000198"/>
</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-04-19T18:04:18.000839" elapsed="0.000210"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.001334" 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-04-19T18:04:18.001174" elapsed="0.000215"/>
</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-04-19T18:04:18.001520" elapsed="0.000201"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.000476" elapsed="0.001324"/>
</kw>
<kw name="验证标记价格">
<kw name="Should Be String" owner="String">
<arg>${price}</arg>
<arg>标记价格应该是字符串格式</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-04-19T18:04:18.002607" elapsed="0.000179"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.003029" 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-04-19T18:04:18.002896" 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-04-19T18:04:18.003181" elapsed="0.000165"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.003686" 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-04-19T18:04:18.003480" elapsed="0.000235"/>
</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-04-19T18:04:18.003824" elapsed="0.000193"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.001987" elapsed="0.002095"/>
</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-04-19T18:04:18.004546" elapsed="0.000238"/>
</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-04-19T18:04:18.004893" elapsed="0.000176"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.005370" 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-04-19T18:04:18.005193" elapsed="0.000208"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.005628" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:18.005703" 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-04-19T18:04:18.005518" elapsed="0.000212"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:18.005844" elapsed="0.000243"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.004242" elapsed="0.001913"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:17.998591" elapsed="0.007619"/>
</kw>
<var name="${mark_price_item}">{'s': 'trb_usdt', 'p': '44.994', 't': 1776061641025}</var>
<status status="PASS" start="2026-04-19T18:04:17.998354" elapsed="0.007889"/>
</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-04-19T18:04:18.006795" elapsed="0.000212"/>
</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-04-19T18:04:18.007106" elapsed="0.000153"/>
</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-04-19T18:04:18.007368" elapsed="0.000142"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-19T18:04:18.007610" elapsed="0.000142"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-04-19T18:04:18.008192" elapsed="0.000142"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.008550" 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-04-19T18:04:18.008432" elapsed="0.000156"/>
</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-04-19T18:04:18.008684" elapsed="0.000137"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.007944" elapsed="0.000933"/>
</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-04-19T18:04:18.009235" elapsed="0.000145"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.009600" 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-04-19T18:04:18.009482" elapsed="0.000161"/>
</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-04-19T18:04:18.009737" elapsed="0.000147"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.010155" 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-04-19T18:04:18.009988" elapsed="0.000188"/>
</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-04-19T18:04:18.010271" elapsed="0.000153"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.009001" elapsed="0.001473"/>
</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-04-19T18:04:18.010930" elapsed="0.000247"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:18.011288" elapsed="0.000173"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.011726" 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-04-19T18:04:18.011561" elapsed="0.000193"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.011951" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:18.012012" 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-04-19T18:04:18.011853" elapsed="0.000181"/>
</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-04-19T18:04:18.012138" elapsed="0.000433"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.010598" elapsed="0.002046"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:18.006492" elapsed="0.006197"/>
</kw>
<var name="${mark_price_item}">{'s': 'xrp_usdt', 'p': '1.8795', 't': 1744189287376}</var>
<status status="PASS" start="2026-04-19T18:04:18.006349" elapsed="0.006365"/>
</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-04-19T18:04:18.013205" elapsed="0.000198"/>
</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-04-19T18:04:18.013501" elapsed="0.000141"/>
</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-04-19T18:04:18.013734" elapsed="0.000129"/>
</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-04-19T18:04:18.013953" 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-04-19T18:04:18.014433" elapsed="0.000178"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.015100" 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-04-19T18:04:18.014848" elapsed="0.000313"/>
</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-04-19T18:04:18.015300" elapsed="0.000201"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.014197" elapsed="0.001381"/>
</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-04-19T18:04:18.016095" elapsed="0.000167"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.016529" 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-04-19T18:04:18.016380" elapsed="0.000196"/>
</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-04-19T18:04:18.016692" elapsed="0.000179"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.017250" level="INFO">${price_float} = 3600.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-04-19T18:04:18.017049" elapsed="0.000231"/>
</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-04-19T18:04:18.017398" elapsed="0.000212"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.015754" elapsed="0.001923"/>
</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-04-19T18:04:18.018143" elapsed="0.000256"/>
</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-04-19T18:04:18.018520" elapsed="0.000175"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.018961" level="INFO">${timestamp_str} = 1776593057250</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:18.018802" elapsed="0.000183"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.019183" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:18.019247" 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-04-19T18:04:18.019082" elapsed="0.000187"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:18.019363" elapsed="0.000209"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.017831" elapsed="0.001797"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:18.012940" elapsed="0.006734"/>
</kw>
<var name="${mark_price_item}">{'s': 'eth_usdt', 'p': '3600', 't': 1776593057250}</var>
<status status="PASS" start="2026-04-19T18:04:18.012806" elapsed="0.006896"/>
</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-04-19T18:04:18.020159" elapsed="0.000194"/>
</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-04-19T18:04:18.020453" elapsed="0.000152"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-19T18:04:18.020704" elapsed="0.000149"/>
</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-04-19T18:04:18.020951" elapsed="0.000146"/>
</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-04-19T18:04:18.021468" elapsed="0.000272"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.021964" 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-04-19T18:04:18.021839" elapsed="0.000165"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:18.022108" elapsed="0.000153"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.021218" elapsed="0.001102"/>
</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-04-19T18:04:18.022697" elapsed="0.000138"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.023055" 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-04-19T18:04:18.022931" elapsed="0.000163"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:18.023187" elapsed="0.000148"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.023606" level="INFO">${price_float} = 84.46</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-04-19T18:04:18.023440" elapsed="0.000190"/>
</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-04-19T18:04:18.023724" elapsed="0.000160"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.022446" elapsed="0.001492"/>
</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-04-19T18:04:18.024315" elapsed="0.000189"/>
</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-04-19T18:04:18.024602" elapsed="0.000170"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.025027" level="INFO">${timestamp_str} = 1776593057240</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:18.024873" elapsed="0.000179"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.025252" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:18.025315" 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-04-19T18:04:18.025152" elapsed="0.000186"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:18.025433" elapsed="0.000199"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.024062" elapsed="0.001656"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:18.019909" elapsed="0.005860"/>
</kw>
<var name="${mark_price_item}">{'s': 'sol_usdt', 'p': '84.46', 't': 1776593057240}</var>
<status status="PASS" start="2026-04-19T18:04:18.019789" elapsed="0.006006"/>
</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-04-19T18:04:18.026235" elapsed="0.000186"/>
</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-04-19T18:04:18.026517" elapsed="0.000130"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-19T18:04:18.026734" elapsed="0.000129"/>
</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-04-19T18:04:18.026949" elapsed="0.000123"/>
</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-04-19T18:04:18.027392" elapsed="0.000114"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.027698" 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-04-19T18:04:18.027593" elapsed="0.000139"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:18.027813" elapsed="0.000123"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.027177" elapsed="0.000807"/>
</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-04-19T18:04:18.028302" elapsed="0.000114"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.028602" 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-04-19T18:04:18.028497" elapsed="0.000140"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:18.028717" elapsed="0.000123"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.029064" 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-04-19T18:04:18.028927" elapsed="0.000156"/>
</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-04-19T18:04:18.029162" elapsed="0.000136"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.028087" elapsed="0.001255"/>
</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-04-19T18:04:18.029666" elapsed="0.000261"/>
</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-04-19T18:04:18.030013" elapsed="0.000134"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.030361" level="INFO">${timestamp_str} = 1776593057250</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:18.030230" elapsed="0.000152"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.030553" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:18.030608" 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-04-19T18:04:18.030465" elapsed="0.000161"/>
</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-04-19T18:04:18.030707" elapsed="0.000185"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.029448" elapsed="0.001492"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:18.025991" elapsed="0.004987"/>
</kw>
<var name="${mark_price_item}">{'s': 'bnb_usdt', 'p': '2085', 't': 1776593057250}</var>
<status status="PASS" start="2026-04-19T18:04:18.025876" elapsed="0.005123"/>
</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-04-19T18:04:18.031375" elapsed="0.000158"/>
</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-04-19T18:04:18.031616" elapsed="0.000128"/>
</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-04-19T18:04:18.031832" elapsed="0.000122"/>
</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-04-19T18:04:18.032040" elapsed="0.000124"/>
</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-04-19T18:04:18.032483" elapsed="0.000112"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.032810" 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-04-19T18:04:18.032680" elapsed="0.000164"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:18.032927" elapsed="0.000121"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.032267" elapsed="0.000829"/>
</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-04-19T18:04:18.033415" elapsed="0.000111"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.033712" 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-04-19T18:04:18.033608" elapsed="0.000137"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:18.033827" elapsed="0.000125"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.034175" 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-04-19T18:04:18.034041" elapsed="0.000154"/>
</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-04-19T18:04:18.034276" elapsed="0.000133"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.033200" elapsed="0.001249"/>
</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-04-19T18:04:18.034731" elapsed="0.000145"/>
</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-04-19T18:04:18.034949" elapsed="0.000118"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.035262" 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-04-19T18:04:18.035142" elapsed="0.000137"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.035427" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:18.035476" 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-04-19T18:04:18.035349" 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-04-19T18:04:18.035563" elapsed="0.000152"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.034541" elapsed="0.001215"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:18.031166" elapsed="0.004624"/>
</kw>
<var name="${mark_price_item}">{'s': 'ordi_usdt', 'p': '2.256', 't': 1776061643383}</var>
<status status="PASS" start="2026-04-19T18:04:18.031066" elapsed="0.004744"/>
</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-04-19T18:04:18.036150" elapsed="0.000144"/>
</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-04-19T18:04:18.036368" elapsed="0.000115"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-19T18:04:18.036558" elapsed="0.000110"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-19T18:04:18.036743" elapsed="0.000108"/>
</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-04-19T18:04:18.037226" elapsed="0.000104"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.037494" 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-04-19T18:04:18.037402" 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-04-19T18:04:18.037596" elapsed="0.000108"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.036944" elapsed="0.000803"/>
</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-04-19T18:04:18.038034" elapsed="0.000101"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.038300" 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-04-19T18:04:18.038207" elapsed="0.000123"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:18.038398" elapsed="0.000098"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.038678" level="INFO">${price_float} = 75023.5</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-04-19T18:04:18.038566" elapsed="0.000127"/>
</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-04-19T18:04:18.038759" elapsed="0.000109"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.037839" elapsed="0.001083"/>
</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-04-19T18:04:18.039180" elapsed="0.000128"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:18.039376" elapsed="0.000108"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.039658" level="INFO">${timestamp_str} = 1776593057236</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:18.039552" elapsed="0.000123"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.039809" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:18.039853" 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-04-19T18:04:18.039741" elapsed="0.000128"/>
</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-04-19T18:04:18.039933" elapsed="0.000140"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.039005" elapsed="0.001105"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:18.035957" elapsed="0.004183"/>
</kw>
<var name="${mark_price_item}">{'s': 'btc_usdt', 'p': '75023.5', 't': 1776593057236}</var>
<status status="PASS" start="2026-04-19T18:04:18.035868" elapsed="0.004290"/>
</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-04-19T18:04:18.040456" elapsed="0.000124"/>
</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-04-19T18:04:18.040648" elapsed="0.000101"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>p</arg>
<arg>标记价格项应包含价格字段(p)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-19T18:04:18.040820" elapsed="0.000097"/>
</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-04-19T18:04:18.040983" elapsed="0.000098"/>
</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-04-19T18:04:18.041341" elapsed="0.000097"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.041586" 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-04-19T18:04:18.041503" elapsed="0.000111"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:18.041677" elapsed="0.000097"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.041171" elapsed="0.000640"/>
</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-04-19T18:04:18.042061" elapsed="0.000090"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.042297" 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-04-19T18:04:18.042215" elapsed="0.000108"/>
</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-04-19T18:04:18.042389" elapsed="0.000098"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.042661" 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-04-19T18:04:18.042554" 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-04-19T18:04:18.042740" elapsed="0.000109"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.041893" elapsed="0.000991"/>
</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-04-19T18:04:18.043145" elapsed="0.000203"/>
</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-04-19T18:04:18.043418" elapsed="0.000106"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.043694" 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-04-19T18:04:18.043591" elapsed="0.000119"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.043841" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:18.043886" 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-04-19T18:04:18.043774" 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-04-19T18:04:18.043964" elapsed="0.000136"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.042970" elapsed="0.001166"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:18.040287" elapsed="0.003880"/>
</kw>
<var name="${mark_price_item}">{'s': '1000shib_usdt', 'p': '0.0058', 't': 1776061707972}</var>
<status status="PASS" start="2026-04-19T18:04:18.040209" elapsed="0.003976"/>
</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-04-19T18:04:18.044500" elapsed="0.000125"/>
</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-04-19T18:04:18.044692" elapsed="0.000104"/>
</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-04-19T18:04:18.044862" elapsed="0.000098"/>
</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-04-19T18:04:18.045027" elapsed="0.000105"/>
</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-04-19T18:04:18.045386" elapsed="0.000089"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.045626" 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-04-19T18:04:18.045543" 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-04-19T18:04:18.045716" elapsed="0.000096"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.045216" elapsed="0.000634"/>
</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-04-19T18:04:18.046103" elapsed="0.000089"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.046338" 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-04-19T18:04:18.046257" elapsed="0.000105"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:18.046421" elapsed="0.000090"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.046679" 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-04-19T18:04:18.046578" elapsed="0.000115"/>
</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-04-19T18:04:18.046751" elapsed="0.000101"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.045932" elapsed="0.000952"/>
</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-04-19T18:04:18.047112" elapsed="0.000113"/>
</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-04-19T18:04:18.047286" elapsed="0.000096"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.047536" 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-04-19T18:04:18.047443" elapsed="0.000108"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.047680" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:18.047719" 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-04-19T18:04:18.047615" 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-04-19T18:04:18.047789" elapsed="0.000123"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.046960" elapsed="0.000985"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:18.044334" elapsed="0.003639"/>
</kw>
<var name="${mark_price_item}">{'s': 'ada_usdt', 'p': '0.2394', 't': 1776061663345}</var>
<status status="PASS" start="2026-04-19T18:04:18.044253" elapsed="0.003736"/>
</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-04-19T18:04:18.048256" elapsed="0.000114"/>
</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-04-19T18:04:18.048431" elapsed="0.000096"/>
</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-04-19T18:04:18.048589" elapsed="0.000089"/>
</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-04-19T18:04:18.048736" elapsed="0.000091"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-04-19T18:04:18.049127" elapsed="0.000084"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.049343" 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-04-19T18:04:18.049270" elapsed="0.000098"/>
</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-04-19T18:04:18.049427" elapsed="0.000085"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.048901" elapsed="0.000669"/>
</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-04-19T18:04:18.049800" elapsed="0.000083"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.050024" 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-04-19T18:04:18.049944" 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-04-19T18:04:18.050109" elapsed="0.000091"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.050363" 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-04-19T18:04:18.050264" elapsed="0.000114"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:18.050438" elapsed="0.000095"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.049648" elapsed="0.000918"/>
</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-04-19T18:04:18.050798" elapsed="0.000112"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:18.050972" elapsed="0.000097"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.051228" 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-04-19T18:04:18.051133" elapsed="0.000110"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.051363" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:18.051403" 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-04-19T18:04:18.051301" elapsed="0.000116"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:18.051474" elapsed="0.000121"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.050641" elapsed="0.000988"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:18.048106" elapsed="0.003549"/>
</kw>
<var name="${mark_price_item}">{'s': 'arb_usdt', 'p': '0.11', 't': 1776061665430}</var>
<status status="PASS" start="2026-04-19T18:04:18.048035" elapsed="0.003637"/>
</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-04-19T18:04:18.051944" elapsed="0.000114"/>
</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-04-19T18:04:18.052118" elapsed="0.000096"/>
</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-04-19T18:04:18.052275" 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-04-19T18:04:18.052426" 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-04-19T18:04:18.052744" elapsed="0.000082"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.052959" 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-04-19T18:04:18.052885" elapsed="0.000098"/>
</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-04-19T18:04:18.053054" elapsed="0.000090"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.052591" elapsed="0.000587"/>
</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-04-19T18:04:18.053404" elapsed="0.000082"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.053621" 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-04-19T18:04:18.053545" elapsed="0.000101"/>
</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-04-19T18:04:18.053704" elapsed="0.000089"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.053956" level="INFO">${price_float} = 0.09362</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-04-19T18:04:18.053855" elapsed="0.000115"/>
</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-04-19T18:04:18.054028" elapsed="0.000095"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.053252" elapsed="0.000903"/>
</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-04-19T18:04:18.054437" elapsed="0.000106"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:18.054614" elapsed="0.000092"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.054857" level="INFO">${timestamp_str} = 1776593057243</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:18.054763" elapsed="0.000107"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.054982" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:18.055018" 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-04-19T18:04:18.054924" elapsed="0.000106"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:18.055083" elapsed="0.000114"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.054231" elapsed="0.000997"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:18.051793" elapsed="0.003462"/>
</kw>
<var name="${mark_price_item}">{'s': 'doge_usdt', 'p': '0.09362', 't': 1776593057243}</var>
<status status="PASS" start="2026-04-19T18:04:18.051722" elapsed="0.003548"/>
</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-04-19T18:04:18.055517" elapsed="0.000105"/>
</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-04-19T18:04:18.055679" 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-04-19T18:04:18.055821" elapsed="0.000083"/>
</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-04-19T18:04:18.055961" elapsed="0.000086"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-04-19T18:04:18.056261" elapsed="0.000076"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.056463" 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-04-19T18:04:18.056393" elapsed="0.000093"/>
</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-04-19T18:04:18.056540" elapsed="0.000081"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.056117" elapsed="0.000535"/>
</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-04-19T18:04:18.056863" elapsed="0.000075"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.057061" 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-04-19T18:04:18.056992" elapsed="0.000092"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:18.057137" elapsed="0.000083"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.057372" 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-04-19T18:04:18.057281" elapsed="0.000104"/>
</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-04-19T18:04:18.057439" elapsed="0.000088"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.056722" elapsed="0.000835"/>
</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-04-19T18:04:18.057769" 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-04-19T18:04:18.057931" elapsed="0.000088"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.058164" 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-04-19T18:04:18.058076" elapsed="0.000101"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.058282" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:18.058315" 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-04-19T18:04:18.058228" 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-04-19T18:04:18.058375" elapsed="0.000116"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.057627" elapsed="0.000892"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:18.055378" elapsed="0.003166"/>
</kw>
<var name="${mark_price_item}">{'s': 'raysol_usdt', 'p': '3.3966', 't': 1747980978061}</var>
<status status="PASS" start="2026-04-19T18:04:18.055313" elapsed="0.003245"/>
</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-04-19T18:04:18.058795" elapsed="0.000098"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>s</arg>
<arg>标记价格项应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-19T18:04:18.058946" elapsed="0.000091"/>
</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-04-19T18:04:18.059092" elapsed="0.000080"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>t</arg>
<arg>标记价格项应包含时间戳字段(t)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-19T18:04:18.059225" 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-04-19T18:04:18.059555" elapsed="0.000071"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.059743" 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-04-19T18:04:18.059678" elapsed="0.000087"/>
</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-04-19T18:04:18.059816" elapsed="0.000075"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.059368" elapsed="0.000552"/>
</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-04-19T18:04:18.060116" elapsed="0.000070"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.060304" 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-04-19T18:04:18.060238" elapsed="0.000087"/>
</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-04-19T18:04:18.060376" elapsed="0.000078"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.060595" 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-04-19T18:04:18.060509" elapsed="0.000099"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${price_float} &gt; 0</arg>
<arg>标记价格应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:18.060658" elapsed="0.000086"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.059984" elapsed="0.000788"/>
</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-04-19T18:04:18.060974" 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-04-19T18:04:18.061124" elapsed="0.000084"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.061344" 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-04-19T18:04:18.061261" elapsed="0.000095"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.061462" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:18.061496" 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-04-19T18:04:18.061407" elapsed="0.000101"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:18.061558" elapsed="0.000107"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.060837" elapsed="0.000857"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:18.058659" elapsed="0.003060"/>
</kw>
<var name="${mark_price_item}">{'s': 'btx_usdt', 'p': '0.0445', 't': 1776061697756}</var>
<status status="PASS" start="2026-04-19T18:04:18.058598" elapsed="0.003135"/>
</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-04-19T18:04:18.061967" elapsed="0.000098"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${mark_price_item}</arg>
<arg>s</arg>
<arg>标记价格项应包含交易对符号字段(s)</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-19T18:04:18.062118" elapsed="0.000079"/>
</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-04-19T18:04:18.062250" 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-04-19T18:04:18.062378" elapsed="0.000080"/>
</kw>
<kw name="验证交易对符号">
<kw name="Should Be String" owner="String">
<arg>${symbol}</arg>
<arg>交易对符号应该是字符串</arg>
<doc>Fails if the given ``item`` is not a string.</doc>
<status status="PASS" start="2026-04-19T18:04:18.062645" elapsed="0.000067"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.062827" 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-04-19T18:04:18.062760" elapsed="0.000087"/>
</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-04-19T18:04:18.062898" elapsed="0.000071"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.062519" elapsed="0.000478"/>
</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-04-19T18:04:18.063183" elapsed="0.000072"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.063378" 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-04-19T18:04:18.063315" elapsed="0.000083"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${price}</arg>
<arg>^\\d+(\\.\\d+)?$</arg>
<arg>标记价格应该是有效的数字格式</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:18.063446" elapsed="0.000075"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.063654" level="INFO">${price_float} = 75074.0115</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-04-19T18:04:18.063572" 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-04-19T18:04:18.063713" elapsed="0.000079"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.063057" 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-04-19T18:04:18.064390" elapsed="0.000094"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:18.064534" elapsed="0.000079"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.064741" level="INFO">${timestamp_str} = 1776593057245</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:18.064662" elapsed="0.000091"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.064852" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:18.064884" 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-04-19T18:04:18.064801" elapsed="0.000094"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:18.064942" elapsed="0.000102"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.063881" elapsed="0.001190"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:18.061834" elapsed="0.003259"/>
</kw>
<var name="${mark_price_item}">{'s': 'btc_usdc', 'p': '75074.0115', 't': 1776593057245}</var>
<status status="PASS" start="2026-04-19T18:04:18.061773" elapsed="0.003333"/>
</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-04-19T18:04:18.065326" elapsed="0.000092"/>
</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-04-19T18:04:18.065468" elapsed="0.000076"/>
</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-04-19T18:04:18.065595" elapsed="0.000073"/>
</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-04-19T18:04:18.065718" elapsed="0.000072"/>
</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-04-19T18:04:18.065977" elapsed="0.000067"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.066155" 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-04-19T18:04:18.066092" elapsed="0.000084"/>
</kw>
<kw name="Should Match Regexp" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>^[A-Za-z0-9]+_[A-Za-z0-9]+$</arg>
<arg>交易对符号应符合格式要求（如btc_usdt或BTC_USDT）</arg>
<doc>Fails if ``string`` does not match ``pattern`` as a regular expression.</doc>
<status status="PASS" start="2026-04-19T18:04:18.066223" elapsed="0.000068"/>
</kw>
<arg>${mark_price_item}[s]</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.065851" elapsed="0.000467"/>
</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-04-19T18:04:18.066496" elapsed="0.000065"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.066667" 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-04-19T18:04:18.066608" elapsed="0.000079"/>
</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-04-19T18:04:18.066733" elapsed="0.000075"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.066936" level="INFO">${price_float} = 4703.4</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-04-19T18:04:18.066859" elapsed="0.000088"/>
</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-04-19T18:04:18.066993" elapsed="0.000076"/>
</kw>
<arg>${mark_price_item}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.066376" elapsed="0.000719"/>
</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-04-19T18:04:18.067277" elapsed="0.000089"/>
</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-04-19T18:04:18.067415" elapsed="0.000077"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.067616" level="INFO">${timestamp_str} = 1776061848683</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:18.067541" elapsed="0.000087"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.067736" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:18.067768" 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-04-19T18:04:18.067687" elapsed="0.000091"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${length} &gt;= 10</arg>
<arg>时间戳长度应该合理（至少10位）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:18.067824" elapsed="0.000097"/>
</kw>
<arg>${mark_price_item}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.067153" elapsed="0.000795"/>
</kw>
<arg>${mark_price_item}</arg>
<doc>验证单个标记价格项的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:18.065202" elapsed="0.002767"/>
</kw>
<var name="${mark_price_item}">{'s': 'xaut_usdt', 'p': '4703.4', 't': 1776061848683}</var>
<status status="PASS" start="2026-04-19T18:04:18.065145" elapsed="0.002837"/>
</iter>
<var>${mark_price_item}</var>
<value>@{mark_price_list}</value>
<status status="PASS" start="2026-04-19T18:04:17.998058" elapsed="0.069937"/>
</for>
<arg>${data}</arg>
<doc>验证期货标记价格列表的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:17.997666" elapsed="0.070353"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.068474" 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-04-19T18:04:18.068236" elapsed="0.000250"/>
</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-04-19T18:04:18.068609" elapsed="0.000226"/>
</kw>
<msg time="2026-04-19T18:04:18.068874" 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-04-19T18:04:18.068542" elapsed="0.000344"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.069012" 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-04-19T18:04:18.068945" elapsed="0.000079"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.069169" 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-04-19T18:04:18.069078" elapsed="0.000102"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.069309" 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-04-19T18:04:18.069235" elapsed="0.000085"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.069492" 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-04-19T18:04:18.069371" elapsed="0.000135"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.069650" 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-04-19T18:04:18.069558" elapsed="0.000104"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.069768" 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-04-19T18:04:18.069713" elapsed="0.000074"/>
</kw>
<arg>获取期货U本位标记价格</arg>
<arg>/v1/future-u/market/public/q/mark-price</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-04-19T18:04:18.068095" elapsed="0.001715"/>
</kw>
<doc>验证期货U本位标记价格接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:17.154965" elapsed="0.914908"/>
</test>
<doc>期货U本位标记价格接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:17.139921" elapsed="0.930095"/>
</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-04-19T18:04:18.072439" 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-04-19T18:04:18.072356" elapsed="0.000095"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.072629" 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-04-19T18:04:18.072573" elapsed="0.000076"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:18.072489" elapsed="0.000174"/>
</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-04-19T18:04:18.072717" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:18.072674" elapsed="0.000065"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:18.072479" elapsed="0.000269"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.073033" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:18.072979" elapsed="0.000073"/>
</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-04-19T18:04:18.073148" 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-04-19T18:04:18.073216" 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-04-19T18:04:18.073267" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:18.073317" 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-04-19T18:04:18.073365" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:18.073080" elapsed="0.000306"/>
</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-04-19T18:04:18.073463" 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-04-19T18:04:18.073513" 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-04-19T18:04:18.073562" 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-04-19T18:04:18.073610" 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-04-19T18:04:18.073658" 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-04-19T18:04:18.073705" 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-04-19T18:04:18.073752" 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-04-19T18:04:18.073800" 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-04-19T18:04:18.073848" elapsed="0.000007"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:18.073396" elapsed="0.000472"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.074014" 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-04-19T18:04:18.073916" elapsed="0.000115"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.074171" 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-04-19T18:04:18.074078" elapsed="0.000109"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.074317" 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-04-19T18:04:18.074231" elapsed="0.000102"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.074463" 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-04-19T18:04:18.074377" elapsed="0.000102"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.074613" 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-04-19T18:04:18.074523" elapsed="0.000107"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.074761" 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-04-19T18:04:18.074674" elapsed="0.000103"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.074921" 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-04-19T18:04:18.074826" elapsed="0.000111"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.075075" 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-04-19T18:04:18.074981" elapsed="0.000110"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.075227" 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-04-19T18:04:18.075134" elapsed="0.000109"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:18.073878" elapsed="0.001379"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:18.073073" elapsed="0.002192"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.075367" 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-04-19T18:04:18.075303" elapsed="0.000083"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:18.075543" 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-04-19T18:04:18.075429" elapsed="0.000243"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:18.072868" elapsed="0.002832"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.075790" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:18.075744" elapsed="0.000064"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:18.072260" elapsed="0.003570"/>
</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-04-19T18:04:18.077226" 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-04-19T18:04:18.076939" elapsed="0.000299"/>
</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-04-19T18:04:18.077510" elapsed="0.000009"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:18.077288" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:18.077281" elapsed="0.000264"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:18.077559" elapsed="0.000015"/>
</return>
<msg time="2026-04-19T18:04:18.077645" 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-04-19T18:04:18.076619" elapsed="0.001037"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:18.912192" 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-04-19T18:04:18.912603" 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': 'Sun, 19 Apr 2026 10:04:18 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '75415a3bcd60121283fecf14ffbb2324', 'X-Transparent': '00-75415a3bcd60121283fecf14ffbb2324-8b05a9726282d17c-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': '9eeb15998fd00ec0-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"btc_usdt","p":"75019.4","t":1776593058253},"ts":1776593058870} 
 </msg>
<msg time="2026-04-19T18:04:18.912746" 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-04-19T18:04:18.913031" 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-04-19T18:04:18.078006" elapsed="0.835059"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:18.913205" elapsed="0.000089"/>
</return>
<msg time="2026-04-19T18:04:18.913564" 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-04-19T18:04:18.077713" elapsed="0.835905"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.915975" 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-04-19T18:04:18.914853" elapsed="0.001257"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.917328" 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-04-19T18:04:18.916352" elapsed="0.001030"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.917883" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:18.917617" elapsed="0.000355"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:18.914106" elapsed="0.003991"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:18.919420" level="INFO">${response_data} = {'s': 'btc_usdt', 'p': '75019.4', 't': 1776593058253}</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-04-19T18:04:18.918319" elapsed="0.001155"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.920034" 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-04-19T18:04:18.919714" elapsed="0.000412"/>
</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-04-19T18:04:18.920317" elapsed="0.000314"/>
</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-04-19T18:04:18.921306" elapsed="0.000411"/>
</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-04-19T18:04:18.921945" elapsed="0.000286"/>
</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-04-19T18:04:18.922389" elapsed="0.000234"/>
</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-04-19T18:04:18.922786" elapsed="0.000223"/>
</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-04-19T18:04:18.923727" elapsed="0.000606"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.924686" 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-04-19T18:04:18.924489" elapsed="0.000261"/>
</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-04-19T18:04:18.924912" elapsed="0.000231"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-19T18:04:18.925539" 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-04-19T18:04:18.925315" elapsed="0.000261"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-19T18:04:18.925950" 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-04-19T18:04:18.925732" elapsed="0.000256"/>
</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-04-19T18:04:18.926123" elapsed="0.000254"/>
</kw>
<arg>${mark_price_data}[s]</arg>
<arg>${expected_symbol}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.923247" elapsed="0.003211"/>
</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-04-19T18:04:18.926949" elapsed="0.000169"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.927389" 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-04-19T18:04:18.927241" elapsed="0.000196"/>
</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-04-19T18:04:18.927557" elapsed="0.000186"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.928097" level="INFO">${price_float} = 75019.4</msg>
<var>${price_float}</var>
<arg>${price}</arg>
<doc>Converts the given item to a floating point number.</doc>
<status status="PASS" start="2026-04-19T18:04:18.927881" elapsed="0.000247"/>
</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-04-19T18:04:18.928251" elapsed="0.000227"/>
</kw>
<arg>${mark_price_data}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.926630" elapsed="0.001918"/>
</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-04-19T18:04:18.929068" 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-04-19T18:04:18.929462" elapsed="0.000192"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.929993" level="INFO">${timestamp_str} = 1776593058253</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:18.929783" elapsed="0.000242"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.930239" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:18.930309" 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-04-19T18:04:18.930132" elapsed="0.000201"/>
</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-04-19T18:04:18.930451" elapsed="0.000256"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-19T18:04:18.931088" level="INFO">${current_time} = 1776593058.930995</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-04-19T18:04:18.930829" elapsed="0.000286"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.931417" level="INFO">${current_timestamp} = 1776593058930</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-04-19T18:04:18.931229" elapsed="0.000226"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.931781" level="INFO">${time_diff} = 677</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-04-19T18:04:18.931561" elapsed="0.000245"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${time_diff} &lt; 300000</arg>
<arg>时间戳应该在当前时间的5分钟内（考虑到网络延迟和时钟差异）</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:18.931930" elapsed="0.000169"/>
</kw>
<arg>${mark_price_data}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:18.928748" elapsed="0.003523"/>
</kw>
<arg>${response_data}</arg>
<arg>btc_usdt</arg>
<doc>验证期货单个交易对标记价格的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:18.920849" elapsed="0.011481"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.933644" 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-04-19T18:04:18.933022" elapsed="0.000655"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:18.933971" elapsed="0.000449"/>
</kw>
<msg time="2026-04-19T18:04:18.934498" 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-04-19T18:04:18.933813" elapsed="0.000707"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.934767" 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-04-19T18:04:18.934631" elapsed="0.000158"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.935059" 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-04-19T18:04:18.934890" elapsed="0.000191"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.935324" 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-04-19T18:04:18.935183" elapsed="0.000162"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.935690" 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-04-19T18:04:18.935446" elapsed="0.000271"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.935983" 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-04-19T18:04:18.935814" elapsed="0.000194"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:18.936239" 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-04-19T18:04:18.936127" elapsed="0.000149"/>
</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-04-19T18:04:18.932591" elapsed="0.003737"/>
</kw>
<doc>验证期货U本位单个交易对标记价格接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:18.075855" elapsed="0.860646"/>
</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-04-19T18:04:18.939949" 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-04-19T18:04:18.939308" elapsed="0.000670"/>
</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-04-19T18:04:18.940641" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:18.940129" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:18.940097" elapsed="0.000624"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:18.940761" elapsed="0.000049"/>
</return>
<msg time="2026-04-19T18:04:18.940979" 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-04-19T18:04:18.938572" elapsed="0.002428"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:19.224569" 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-04-19T18:04:19.225135" 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': 'Sun, 19 Apr 2026 10:04:19 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '4de78d463802ff8e17478695c581a298', 'X-Transparent': '00-4de78d463802ff8e17478695c581a298-14b0115381fcb4b3-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': '9eeb159b18ed0ec0-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"s":"eth_usdt","p":"3600","t":1776593058264},"ts":1776593059112} 
 </msg>
<msg time="2026-04-19T18:04:19.225310" 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-04-19T18:04:19.225714" 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-04-19T18:04:18.942311" elapsed="0.283477"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:19.226014" elapsed="0.000131"/>
</return>
<msg time="2026-04-19T18:04:19.226535" 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-04-19T18:04:18.941139" elapsed="0.285450"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.229244" 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-04-19T18:04:19.228024" elapsed="0.001372"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.230669" 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-04-19T18:04:19.229652" elapsed="0.001084"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.231257" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:19.230982" elapsed="0.000367"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:19.227153" elapsed="0.004314"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:19.232878" level="INFO">${response_data} = {'s': 'eth_usdt', 'p': '3600', 't': 1776593058264}</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-04-19T18:04:19.231713" elapsed="0.001223"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.233538" 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-04-19T18:04:19.233194" elapsed="0.000434"/>
</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-04-19T18:04:19.233868" elapsed="0.000540"/>
</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-04-19T18:04:19.235250" elapsed="0.000318"/>
</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-04-19T18:04:19.235748" elapsed="0.000259"/>
</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-04-19T18:04:19.236167" elapsed="0.000232"/>
</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-04-19T18:04:19.236563" elapsed="0.000245"/>
</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-04-19T18:04:19.237569" elapsed="0.000230"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.238177" 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-04-19T18:04:19.237955" elapsed="0.000287"/>
</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-04-19T18:04:19.238406" elapsed="0.000218"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-19T18:04:19.238957" 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-04-19T18:04:19.238777" elapsed="0.000209"/>
</kw>
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-19T18:04:19.239288" 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-04-19T18:04:19.239109" elapsed="0.000302"/>
</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-04-19T18:04:19.239543" elapsed="0.000251"/>
</kw>
<arg>${mark_price_data}[s]</arg>
<arg>${expected_symbol}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:19.237050" elapsed="0.002821"/>
</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-04-19T18:04:19.240378" elapsed="0.000167"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.240825" 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-04-19T18:04:19.240673" elapsed="0.000211"/>
</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-04-19T18:04:19.241010" elapsed="0.000189"/>
</kw>
<kw name="Convert To Number" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.241558" level="INFO">${price_float} = 3600.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-04-19T18:04:19.241343" elapsed="0.000245"/>
</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-04-19T18:04:19.241714" elapsed="0.000236"/>
</kw>
<arg>${mark_price_data}[p]</arg>
<doc>验证标记价格格式</doc>
<status status="PASS" start="2026-04-19T18:04:19.240054" elapsed="0.001977"/>
</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-04-19T18:04:19.242853" elapsed="0.000253"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:19.243218" elapsed="0.000171"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.243679" level="INFO">${timestamp_str} = 1776593058264</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:19.243502" elapsed="0.000203"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.243929" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:19.243999" 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-04-19T18:04:19.243819" elapsed="0.000203"/>
</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-04-19T18:04:19.244130" elapsed="0.000241"/>
</kw>
<kw name="Get Current Date" owner="DateTime">
<msg time="2026-04-19T18:04:19.244752" level="INFO">${current_time} = 1776593059.244662</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-04-19T18:04:19.244488" elapsed="0.000290"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.245087" level="INFO">${current_timestamp} = 1776593059244</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-04-19T18:04:19.244893" elapsed="0.000220"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.245435" level="INFO">${time_diff} = 980</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-04-19T18:04:19.245221" elapsed="0.000239"/>
</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-04-19T18:04:19.245565" elapsed="0.000165"/>
</kw>
<arg>${mark_price_data}[t]</arg>
<doc>验证时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:19.242253" elapsed="0.003538"/>
</kw>
<arg>${response_data}</arg>
<arg>eth_usdt</arg>
<doc>验证期货单个交易对标记价格的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:19.234766" elapsed="0.011078"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.246840" 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-04-19T18:04:19.246371" elapsed="0.000496"/>
</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-04-19T18:04:19.247139" elapsed="0.000449"/>
</kw>
<msg time="2026-04-19T18:04:19.247667" 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-04-19T18:04:19.246989" elapsed="0.000699"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.247929" 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-04-19T18:04:19.247803" elapsed="0.000148"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.248236" 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-04-19T18:04:19.248054" elapsed="0.000204"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.248524" 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-04-19T18:04:19.248364" elapsed="0.000184"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.248896" 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-04-19T18:04:19.248652" elapsed="0.000340"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.249271" 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-04-19T18:04:19.249095" elapsed="0.000202"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.249503" 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-04-19T18:04:19.249397" elapsed="0.000145"/>
</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-04-19T18:04:19.246042" elapsed="0.003554"/>
</kw>
<doc>验证期货U本位ETH交易对标记价格接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:18.936795" elapsed="0.312981"/>
</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-04-19T18:04:19.253375" 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-04-19T18:04:19.252745" elapsed="0.000658"/>
</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-04-19T18:04:19.254024" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:19.253549" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:19.253517" elapsed="0.000580"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:19.254129" elapsed="0.000036"/>
</return>
<msg time="2026-04-19T18:04:19.254499" 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-04-19T18:04:19.252016" elapsed="0.002535"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:19.471697" 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-04-19T18:04:19.472164" 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': 'Sun, 19 Apr 2026 10:04:19 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '3703bf1f44556c03992fbf99783493fa', 'X-Transparent': '00-3703bf1f44556c03992fbf99783493fa-63b161e1a0fa4fba-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.014', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': '9eeb159d0a520ec0-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1776593059430} 
 </msg>
<msg time="2026-04-19T18:04:19.472388" 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-04-19T18:04:19.472852" 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-04-19T18:04:19.255643" elapsed="0.217275"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:19.473178" elapsed="0.000176"/>
</return>
<msg time="2026-04-19T18:04:19.473780" 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-04-19T18:04:19.254811" elapsed="0.219028"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.475861" 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-04-19T18:04:19.474300" elapsed="0.001709"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:19.477419" 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-04-19T18:04:19.476351" elapsed="0.001116"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:19.478557" 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-04-19T18:04:19.477673" elapsed="0.000930"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:19.479675" 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-04-19T18:04:19.478809" elapsed="0.000908"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.480154" 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-04-19T18:04:19.479906" elapsed="0.000330"/>
</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-04-19T18:04:19.480405" elapsed="0.000239"/>
</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-04-19T18:04:19.480840" elapsed="0.000272"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.483213" 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-04-19T18:04:19.482569" elapsed="0.000679"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:19.483648" elapsed="0.000626"/>
</kw>
<msg time="2026-04-19T18:04:19.484382" 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-04-19T18:04:19.483424" elapsed="0.000988"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.484760" 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-04-19T18:04:19.484572" elapsed="0.000218"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.485213" 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-04-19T18:04:19.484932" elapsed="0.000314"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.485587" 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-04-19T18:04:19.485386" elapsed="0.000235"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.486093" 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-04-19T18:04:19.485758" elapsed="0.000373"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.486502" 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-04-19T18:04:19.486271" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.486831" 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-04-19T18:04:19.486686" elapsed="0.000198"/>
</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-04-19T18:04:19.481485" elapsed="0.005475"/>
</kw>
<doc>验证期货U本位标记价格接口对无效交易对的处理</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:19.250042" elapsed="0.237158"/>
</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-04-19T18:04:19.491946" 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-04-19T18:04:19.491084" elapsed="0.000892"/>
</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-04-19T18:04:19.492690" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:19.492176" elapsed="0.000572"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:19.492144" elapsed="0.000632"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:19.492823" elapsed="0.000039"/>
</return>
<msg time="2026-04-19T18:04:19.493020" 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-04-19T18:04:19.490141" elapsed="0.002901"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:19.749054" 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-04-19T18:04:19.749453" 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': 'Sun, 19 Apr 2026 10:04:19 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9997', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '52518b748c32d179b4e68b51b920004c', 'X-Transparent': '00-52518b748c32d179b4e68b51b920004c-e7d7634c868408ef-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': '9eeb159e8b520ec0-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1776593059664} 
 </msg>
<msg time="2026-04-19T18:04:19.749644" 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-04-19T18:04:19.750046" 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-04-19T18:04:19.493823" elapsed="0.256287"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:19.750332" elapsed="0.000132"/>
</return>
<msg time="2026-04-19T18:04:19.750849" 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-04-19T18:04:19.493195" elapsed="0.257710"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.752898" 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-04-19T18:04:19.751373" elapsed="0.001689"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:19.754681" 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-04-19T18:04:19.753431" elapsed="0.001321"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:19.756303" 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-04-19T18:04:19.755065" elapsed="0.001298"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:19.757655" 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-04-19T18:04:19.756655" elapsed="0.001045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.758153" 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-04-19T18:04:19.757897" elapsed="0.000341"/>
</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-04-19T18:04:19.758445" elapsed="0.000298"/>
</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-04-19T18:04:19.758974" elapsed="0.000350"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.761115" 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-04-19T18:04:19.760334" elapsed="0.000817"/>
</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-04-19T18:04:19.761526" elapsed="0.001039"/>
</kw>
<msg time="2026-04-19T18:04:19.762698" 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-04-19T18:04:19.761332" elapsed="0.001399"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.763226" 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-04-19T18:04:19.762995" elapsed="0.000264"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.763714" 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-04-19T18:04:19.763423" elapsed="0.000324"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.764120" 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-04-19T18:04:19.763904" elapsed="0.000249"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.764682" 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-04-19T18:04:19.764306" elapsed="0.000420"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.765200" 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-04-19T18:04:19.764903" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.765522" 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-04-19T18:04:19.765380" elapsed="0.000190"/>
</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-04-19T18:04:19.759725" elapsed="0.005917"/>
</kw>
<doc>验证期货U本位标记价格接口对缺少参数的处理</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:19.487662" elapsed="0.278178"/>
</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-04-19T18:04:19.770847" 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-04-19T18:04:19.770099" elapsed="0.000789"/>
</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-04-19T18:04:19.771676" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:19.771068" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:19.771028" elapsed="0.000754"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:19.771828" elapsed="0.000053"/>
</return>
<msg time="2026-04-19T18:04:19.772099" 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-04-19T18:04:19.769169" elapsed="0.002957"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:19.987858" 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-04-19T18:04:19.988291" 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': 'Sun, 19 Apr 2026 10:04:19 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9996', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '09c3b13290a2aa0ad2816230ec7dfe15', 'X-Transparent': '00-09c3b13290a2aa0ad2816230ec7dfe15-94cf43eb6380b6a6-01', 'X-Upstream-Addr': '10.9.138.58:8080', 'X-Upstream-Header-Time': '0.014', 'X-Upstream-Service': 'default-future-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': '9eeb15a04c4d0ec0-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1776593059948} 
 </msg>
<msg time="2026-04-19T18:04:19.988637" 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-04-19T18:04:19.989033" 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-04-19T18:04:19.773444" elapsed="0.215659"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:19.989338" elapsed="0.000151"/>
</return>
<msg time="2026-04-19T18:04:19.989925" 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-04-19T18:04:19.772318" elapsed="0.217669"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.992118" 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-04-19T18:04:19.990548" elapsed="0.001727"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:19.993825" 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-04-19T18:04:19.992592" elapsed="0.001291"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:19.995358" 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-04-19T18:04:19.994159" elapsed="0.001258"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:19.996612" 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-04-19T18:04:19.995669" elapsed="0.000982"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.997079" 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-04-19T18:04:19.996831" elapsed="0.000337"/>
</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-04-19T18:04:19.997359" elapsed="0.000271"/>
</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-04-19T18:04:19.997813" elapsed="0.000306"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:19.999911" 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-04-19T18:04:19.999174" elapsed="0.000776"/>
</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-04-19T18:04:20.000367" elapsed="0.000603"/>
</kw>
<msg time="2026-04-19T18:04:20.001072" 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-04-19T18:04:20.000151" elapsed="0.000949"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.001446" 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-04-19T18:04:20.001262" elapsed="0.000214"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.001869" 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-04-19T18:04:20.001617" elapsed="0.000285"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.002242" 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-04-19T18:04:20.002040" elapsed="0.000231"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.002767" 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-04-19T18:04:20.002416" elapsed="0.000389"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.003198" 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-04-19T18:04:20.002946" elapsed="0.000380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.003624" 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-04-19T18:04:20.003472" elapsed="0.000208"/>
</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-04-19T18:04:19.998529" elapsed="0.005224"/>
</kw>
<doc>验证期货U本位标记价格接口对大写交易对的处理（应返回错误）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:19.766176" elapsed="0.237821"/>
</test>
<doc>期货U本位单个交易对标记价格接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:18.070508" elapsed="1.934013"/>
</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-04-19T18:04:20.011337" 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-04-19T18:04:20.011145" elapsed="0.000219"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.011789" 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-04-19T18:04:20.011672" elapsed="0.000160"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:20.011468" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:20.011984" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:20.011897" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:20.011433" elapsed="0.000622"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.013166" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:20.012989" elapsed="0.000242"/>
</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-04-19T18:04:20.013561" 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-04-19T18:04:20.013712" 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-04-19T18:04:20.013842" 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-04-19T18:04:20.013974" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:20.014095" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:20.013329" elapsed="0.000820"/>
</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-04-19T18:04:20.014368" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:20.014501" 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-04-19T18:04:20.014632" 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-04-19T18:04:20.014751" 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-04-19T18:04:20.014876" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:20.014995" 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-04-19T18:04:20.015113" 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-04-19T18:04:20.015232" 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-04-19T18:04:20.015350" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:20.014181" elapsed="0.001218"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.015804" 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-04-19T18:04:20.015530" elapsed="0.000336"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.016234" 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-04-19T18:04:20.015987" elapsed="0.000293"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.016642" 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-04-19T18:04:20.016397" elapsed="0.000290"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.017116" 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-04-19T18:04:20.016863" elapsed="0.000306"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.017537" 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-04-19T18:04:20.017290" elapsed="0.000289"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.017936" 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-04-19T18:04:20.017705" elapsed="0.000287"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.018501" 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-04-19T18:04:20.018109" elapsed="0.000436"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.018903" 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-04-19T18:04:20.018663" elapsed="0.000282"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.019307" 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-04-19T18:04:20.019062" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:20.015428" elapsed="0.003959"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:20.013304" elapsed="0.006108"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.019702" 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-04-19T18:04:20.019520" elapsed="0.000232"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:20.020186" 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-04-19T18:04:20.019871" elapsed="0.000504"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:20.012569" elapsed="0.007872"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.020627" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:20.020541" elapsed="0.000125"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:20.010889" elapsed="0.009825"/>
</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-04-19T18:04:20.023694" 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-04-19T18:04:20.023030" elapsed="0.000701"/>
</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-04-19T18:04:20.024378" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:20.023860" elapsed="0.000579"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:20.023841" elapsed="0.000620"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:20.024495" elapsed="0.000037"/>
</return>
<msg time="2026-04-19T18:04:20.024698" 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-04-19T18:04:20.022255" elapsed="0.002467"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:20.795620" 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-04-19T18:04:20.795996" 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': 'Sun, 19 Apr 2026 10:04:20 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '75ed2e2d9f514aed7d8016ccb190d7af', 'X-Transparent': '00-75ed2e2d9f514aed7d8016ccb190d7af-f0c9922bc718e9de-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': '9eeb15a43e9d20f1-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1776593059322,"s":"btc_usdt","c":"75019.30","h":"76400.00","l":"74828.10","a":"63350983","v":"479623742","o":"76368.70","r":"-0.0176"},"ts":1776593060641} 
 </msg>
<msg time="2026-04-19T18:04:20.796337" 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-04-19T18:04:20.796665" 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-04-19T18:04:20.025219" elapsed="0.771506"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:20.796920" elapsed="0.000124"/>
</return>
<msg time="2026-04-19T18:04:20.797403" 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-04-19T18:04:20.024862" elapsed="0.772600"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.800005" 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-04-19T18:04:20.798797" elapsed="0.001372"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.801509" 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-04-19T18:04:20.800467" elapsed="0.001095"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.802102" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:20.801818" elapsed="0.000383"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:20.798008" elapsed="0.004315"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.803592" 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-04-19T18:04:20.802571" elapsed="0.001116"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.804941" level="INFO">${ticker_data} = {'t': 1776593059322, 's': 'btc_usdt', 'c': '75019.30', 'h': '76400.00', 'l': '74828.10', 'a': '63350983', 'v': '479623742', 'o': '76368.70', 'r': '-0.0176'}</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-04-19T18:04:20.803925" elapsed="0.001077"/>
</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-04-19T18:04:20.806010" elapsed="0.000228"/>
</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-04-19T18:04:20.806402" elapsed="0.000191"/>
</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-04-19T18:04:20.806746" elapsed="0.000197"/>
</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-04-19T18:04:20.807099" elapsed="0.000201"/>
</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-04-19T18:04:20.807454" elapsed="0.000197"/>
</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-04-19T18:04:20.807807" elapsed="0.000181"/>
</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-04-19T18:04:20.808150" elapsed="0.000184"/>
</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-04-19T18:04:20.808509" elapsed="0.000185"/>
</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-04-19T18:04:20.808848" elapsed="0.000595"/>
</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-04-19T18:04:20.810499" elapsed="0.000311"/>
</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-04-19T18:04:20.810956" elapsed="0.000230"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.811539" level="INFO">${timestamp_str} = 1776593059322</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:20.811324" elapsed="0.000251"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.811862" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:20.811957" 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-04-19T18:04:20.811717" elapsed="0.000269"/>
</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-04-19T18:04:20.812125" elapsed="0.000360"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证单个Ticker时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:20.809669" elapsed="0.002974"/>
</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-04-19T18:04:20.813601" elapsed="0.000145"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.813963" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-04-19T18:04:20.813852" 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-04-19T18:04:20.814110" elapsed="0.000129"/>
</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-04-19T18:04:20.814374" elapsed="0.000153"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证单个Ticker交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:20.812848" elapsed="0.001739"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.815662" 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-04-19T18:04:20.815442" elapsed="0.000252"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:20.815801" elapsed="0.000223"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:20.816169" elapsed="0.000154"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${price}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-19T18:04:20.816669" elapsed="0.000122"/>
</kw>
<msg time="2026-04-19T18:04:20.816872" level="INFO">${price_float} = 75019.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-04-19T18:04:20.816450" elapsed="0.000446"/>
</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-04-19T18:04:20.817014" elapsed="0.000265"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:20.814747" elapsed="0.002587"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.818204" 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-04-19T18:04:20.818047" elapsed="0.000179"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:20.818319" elapsed="0.000179"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:20.818598" elapsed="0.000110"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${price}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-19T18:04:20.818985" elapsed="0.000108"/>
</kw>
<msg time="2026-04-19T18:04:20.819168" level="INFO">${price_float} = 76400.00</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-04-19T18:04:20.818814" elapsed="0.000374"/>
</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-04-19T18:04:20.819296" elapsed="0.000219"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:20.817466" elapsed="0.002107"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.820434" 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-04-19T18:04:20.820278" elapsed="0.000179"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:20.820548" elapsed="0.000175"/>
</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-04-19T18:04:20.820831" elapsed="0.000107"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Set Variable" owner="BuiltIn">
<arg>${price}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-19T18:04:20.821322" elapsed="0.000218"/>
</kw>
<msg time="2026-04-19T18:04:20.821647" level="INFO">${price_float} = 74828.10</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-04-19T18:04:20.821048" elapsed="0.000629"/>
</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-04-19T18:04:20.821814" elapsed="0.000324"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:20.819696" elapsed="0.002520"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.823591" 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-04-19T18:04:20.823214" elapsed="0.000407"/>
</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-04-19T18:04:20.823738" elapsed="0.000246"/>
</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-04-19T18:04:20.824120" elapsed="0.000151"/>
</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-04-19T18:04:20.824625" elapsed="0.000130"/>
</kw>
<msg time="2026-04-19T18:04:20.824844" level="INFO">${price_float} = 76368.70</msg>
<var>${price_float}</var>
<arg>'${price_type}' == 'str'</arg>
<arg>Convert To Number</arg>
<arg>${price}</arg>
<arg>ELSE</arg>
<arg>Set Variable</arg>
<arg>${price}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:20.824402" elapsed="0.000468"/>
</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-04-19T18:04:20.825002" elapsed="0.000282"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:20.822403" elapsed="0.002950"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.826389" 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-04-19T18:04:20.826184" elapsed="0.000235"/>
</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-04-19T18:04:20.826533" elapsed="0.000228"/>
</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-04-19T18:04:20.826884" elapsed="0.000142"/>
</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-04-19T18:04:20.827366" elapsed="0.000131"/>
</kw>
<msg time="2026-04-19T18:04:20.827588" level="INFO">${amount_float} = 63350983</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-04-19T18:04:20.827153" elapsed="0.000463"/>
</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-04-19T18:04:20.827750" elapsed="0.000279"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:20.825514" elapsed="0.002580"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.829108" 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-04-19T18:04:20.828908" elapsed="0.000232"/>
</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-04-19T18:04:20.829238" elapsed="0.000185"/>
</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-04-19T18:04:20.829532" elapsed="0.000117"/>
</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-04-19T18:04:20.829937" elapsed="0.000107"/>
</kw>
<msg time="2026-04-19T18:04:20.830121" level="INFO">${amount_float} = 479623742</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-04-19T18:04:20.829762" elapsed="0.000385"/>
</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-04-19T18:04:20.830249" elapsed="0.000227"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:20.828246" elapsed="0.002287"/>
</kw>
<kw name="验证单个Ticker涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:20.831385" 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-04-19T18:04:20.831205" 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-04-19T18:04:20.831505" elapsed="0.000162"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:20.831773" elapsed="0.000112"/>
</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-04-19T18:04:20.832176" elapsed="0.000106"/>
</kw>
<msg time="2026-04-19T18:04:20.832352" level="INFO">${rate_float} = -0.0176</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-04-19T18:04:20.831996" elapsed="0.000377"/>
</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-04-19T18:04:20.832507" elapsed="0.000242"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证单个Ticker涨跌幅格式</doc>
<status status="PASS" start="2026-04-19T18:04:20.830666" elapsed="0.002138"/>
</kw>
<arg>${ticker_data}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-04-19T18:04:20.805533" elapsed="0.027320"/>
</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-04-19T18:04:20.832957" elapsed="0.000479"/>
</kw>
<doc>验证期货U本位单个Ticker接口功能（BTC交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:20.020775" elapsed="0.812782"/>
</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-04-19T18:04:20.836379" 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-04-19T18:04:20.835756" elapsed="0.000651"/>
</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-04-19T18:04:20.837011" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:20.836531" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:20.836512" elapsed="0.000578"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:20.837118" elapsed="0.000028"/>
</return>
<msg time="2026-04-19T18:04:20.837286" 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-04-19T18:04:20.835061" elapsed="0.002246"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:21.046501" 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-04-19T18:04:21.046913" 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': 'Sun, 19 Apr 2026 10:04:21 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': 'dd53272a2608ba8acd9db6440af67831', 'X-Transparent': '00-dd53272a2608ba8acd9db6440af67831-ea879ecaec912753-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': '9eeb15a6e98e20f1-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":1776593060999} 
 </msg>
<msg time="2026-04-19T18:04:21.047128" 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-04-19T18:04:21.047570" 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-04-19T18:04:20.837713" elapsed="0.209922"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:21.047890" elapsed="0.000150"/>
</return>
<msg time="2026-04-19T18:04:21.048450" 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-04-19T18:04:20.837418" elapsed="0.211086"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.051124" 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-04-19T18:04:21.049995" elapsed="0.001233"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.052225" 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-04-19T18:04:21.051427" elapsed="0.000843"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.052689" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:21.052464" elapsed="0.000292"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:21.049108" elapsed="0.003816"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.053851" 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-04-19T18:04:21.053090" elapsed="0.000834"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.054810" 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-04-19T18:04:21.054090" elapsed="0.000763"/>
</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-04-19T18:04:21.055577" elapsed="0.000173"/>
</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-04-19T18:04:21.055873" elapsed="0.000153"/>
</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-04-19T18:04:21.056152" elapsed="0.000148"/>
</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-04-19T18:04:21.056429" elapsed="0.000146"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>l</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:21.056700" elapsed="0.000146"/>
</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-04-19T18:04:21.056961" elapsed="0.000156"/>
</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-04-19T18:04:21.057239" elapsed="0.000143"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:21.057508" elapsed="0.000150"/>
</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-04-19T18:04:21.057787" elapsed="0.000141"/>
</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-04-19T18:04:21.058850" elapsed="0.000264"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:21.059225" elapsed="0.000175"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.059697" 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-04-19T18:04:21.059517" elapsed="0.000206"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.059944" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:21.060013" 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-04-19T18:04:21.059838" 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-04-19T18:04:21.060143" elapsed="0.000258"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证单个Ticker时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.058109" elapsed="0.002355"/>
</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-04-19T18:04:21.061274" elapsed="0.000157"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.061655" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-04-19T18:04:21.061542" elapsed="0.000156"/>
</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-04-19T18:04:21.061800" elapsed="0.000144"/>
</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-04-19T18:04:21.062049" elapsed="0.000136"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证单个Ticker交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.060617" elapsed="0.001636"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.063446" 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-04-19T18:04:21.063094" elapsed="0.000377"/>
</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-04-19T18:04:21.063569" elapsed="0.000206"/>
</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-04-19T18:04:21.063914" elapsed="0.000140"/>
</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-04-19T18:04:21.064359" elapsed="0.000105"/>
</kw>
<msg time="2026-04-19T18:04:21.064536" 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-04-19T18:04:21.064163" elapsed="0.000394"/>
</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-04-19T18:04:21.064659" elapsed="0.000227"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.062432" elapsed="0.002508"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.065852" 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-04-19T18:04:21.065696" elapsed="0.000181"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:21.065971" 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-04-19T18:04:21.066248" elapsed="0.000111"/>
</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-04-19T18:04:21.066635" elapsed="0.000184"/>
</kw>
<msg time="2026-04-19T18:04:21.066932" 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-04-19T18:04:21.066463" 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-04-19T18:04:21.067120" elapsed="0.000312"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.065125" elapsed="0.002380"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.068576" 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-04-19T18:04:21.068364" elapsed="0.000240"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:21.068721" elapsed="0.000222"/>
</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-04-19T18:04:21.069073" 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-04-19T18:04:21.069562" elapsed="0.000130"/>
</kw>
<msg time="2026-04-19T18:04:21.069780" 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-04-19T18:04:21.069347" elapsed="0.000459"/>
</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-04-19T18:04:21.069935" elapsed="0.000275"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.067674" elapsed="0.002621"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.071329" 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-04-19T18:04:21.071120" elapsed="0.000237"/>
</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-04-19T18:04:21.071468" elapsed="0.000227"/>
</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-04-19T18:04:21.071821" elapsed="0.000144"/>
</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-04-19T18:04:21.072313" elapsed="0.000127"/>
</kw>
<msg time="2026-04-19T18:04:21.072526" 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-04-19T18:04:21.072103" 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-04-19T18:04:21.072678" elapsed="0.000270"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.070444" elapsed="0.002572"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.074020" 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-04-19T18:04:21.073818" elapsed="0.000229"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:21.074157" elapsed="0.000221"/>
</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-04-19T18:04:21.074503" elapsed="0.000140"/>
</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-04-19T18:04:21.074956" elapsed="0.000117"/>
</kw>
<msg time="2026-04-19T18:04:21.075146" 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-04-19T18:04:21.074772" elapsed="0.000436"/>
</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-04-19T18:04:21.075317" elapsed="0.000231"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.073166" elapsed="0.002435"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.076441" 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-04-19T18:04:21.076274" elapsed="0.000191"/>
</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-04-19T18:04:21.076559" elapsed="0.000188"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:21.076851" elapsed="0.000118"/>
</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-04-19T18:04:21.077250" elapsed="0.000107"/>
</kw>
<msg time="2026-04-19T18:04:21.077428" 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-04-19T18:04:21.077075" elapsed="0.000376"/>
</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-04-19T18:04:21.077555" elapsed="0.000223"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.075727" elapsed="0.002103"/>
</kw>
<kw name="验证单个Ticker涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.078800" 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-04-19T18:04:21.078625" elapsed="0.000199"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:21.078919" elapsed="0.000157"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:21.079176" elapsed="0.000116"/>
</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-04-19T18:04:21.079573" elapsed="0.000107"/>
</kw>
<msg time="2026-04-19T18:04:21.079750" 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-04-19T18:04:21.079400" elapsed="0.000372"/>
</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-04-19T18:04:21.079876" elapsed="0.000240"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证单个Ticker涨跌幅格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.077959" elapsed="0.002212"/>
</kw>
<arg>${ticker_data}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.055215" elapsed="0.025005"/>
</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-04-19T18:04:21.080327" elapsed="0.000446"/>
</kw>
<doc>验证期货U本位单个Ticker接口功能（ETH交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:20.833745" elapsed="0.247142"/>
</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-04-19T18:04:21.083573" 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-04-19T18:04:21.083035" elapsed="0.000561"/>
</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-04-19T18:04:21.084103" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:21.083695" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:21.083680" elapsed="0.000487"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:21.084197" elapsed="0.000025"/>
</return>
<msg time="2026-04-19T18:04:21.084352" 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-04-19T18:04:21.082409" elapsed="0.001964"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:21.320625" 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-04-19T18:04:21.321053" 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': 'Sun, 19 Apr 2026 10:04:21 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '8f581d63cce1bc38b758b8492ec9f4f6', 'X-Transparent': '00-8f581d63cce1bc38b758b8492ec9f4f6-b8d46edd1b8cd74f-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': '9eeb15a87ae720f1-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":{"t":1771066846936,"s":"sol_usdt","c":"85.79","h":"86.36","l":"79.68","a":"15823628","v":"131982690","o":"80.13","r":"0.0706"},"ts":1776593061246} 
 </msg>
<msg time="2026-04-19T18:04:21.321245" 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-04-19T18:04:21.321662" 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-04-19T18:04:21.084793" elapsed="0.236936"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:21.321986" elapsed="0.000144"/>
</return>
<msg time="2026-04-19T18:04:21.322524" 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-04-19T18:04:21.084505" elapsed="0.238082"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.325388" 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-04-19T18:04:21.324142" elapsed="0.001391"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.326900" 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-04-19T18:04:21.325810" elapsed="0.001148"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.327531" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:21.327221" elapsed="0.000410"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:21.323230" elapsed="0.004539"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.329094" 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-04-19T18:04:21.328021" elapsed="0.001169"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.330164" level="INFO">${ticker_data} = {'t': 1771066846936, 's': 'sol_usdt', 'c': '85.79', 'h': '86.36', 'l': '79.68', 'a': '15823628', 'v': '131982690', 'o': '80.13', 'r': '0.0706'}</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-04-19T18:04:21.329419" elapsed="0.000786"/>
</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-04-19T18:04:21.331121" elapsed="0.000214"/>
</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-04-19T18:04:21.331499" elapsed="0.000187"/>
</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-04-19T18:04:21.331849" elapsed="0.000197"/>
</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-04-19T18:04:21.332200" elapsed="0.000192"/>
</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-04-19T18:04:21.332552" elapsed="0.000197"/>
</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-04-19T18:04:21.332900" elapsed="0.000188"/>
</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-04-19T18:04:21.333240" elapsed="0.000189"/>
</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-04-19T18:04:21.333582" elapsed="0.000161"/>
</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-04-19T18:04:21.333865" elapsed="0.000159"/>
</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-04-19T18:04:21.335415" elapsed="0.000302"/>
</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-04-19T18:04:21.335855" elapsed="0.000200"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.336469" level="INFO">${timestamp_str} = 1771066846936</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:21.336248" elapsed="0.000257"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.336769" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:21.336852" 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-04-19T18:04:21.336640" elapsed="0.000239"/>
</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-04-19T18:04:21.336999" elapsed="0.000301"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证单个Ticker时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.334230" elapsed="0.003144"/>
</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-04-19T18:04:21.338202" elapsed="0.000143"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.338561" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-04-19T18:04:21.338450" elapsed="0.000153"/>
</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-04-19T18:04:21.338705" elapsed="0.000128"/>
</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-04-19T18:04:21.338955" elapsed="0.000145"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证单个Ticker交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.337563" elapsed="0.001595"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.340170" 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-04-19T18:04:21.339978" elapsed="0.000220"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:21.340305" elapsed="0.000219"/>
</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-04-19T18:04:21.340671" elapsed="0.000166"/>
</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-04-19T18:04:21.341197" elapsed="0.000121"/>
</kw>
<msg time="2026-04-19T18:04:21.341404" level="INFO">${price_float} = 85.79</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-04-19T18:04:21.340978" 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-04-19T18:04:21.341548" elapsed="0.000227"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.339318" elapsed="0.002512"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.342702" 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-04-19T18:04:21.342546" elapsed="0.000181"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:21.342820" elapsed="0.000183"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:21.343107" elapsed="0.000111"/>
</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-04-19T18:04:21.343503" elapsed="0.000099"/>
</kw>
<msg time="2026-04-19T18:04:21.343670" level="INFO">${price_float} = 86.36</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-04-19T18:04:21.343326" elapsed="0.000365"/>
</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-04-19T18:04:21.343803" elapsed="0.000227"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.341963" elapsed="0.002117"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.344959" 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-04-19T18:04:21.344800" elapsed="0.000181"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:21.345070" elapsed="0.000182"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:21.345351" 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-04-19T18:04:21.345823" elapsed="0.000199"/>
</kw>
<msg time="2026-04-19T18:04:21.346165" level="INFO">${price_float} = 79.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-04-19T18:04:21.345563" elapsed="0.000632"/>
</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-04-19T18:04:21.346328" elapsed="0.000282"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.344210" elapsed="0.002472"/>
</kw>
<kw name="验证单个Ticker价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.347746" 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-04-19T18:04:21.347543" elapsed="0.000231"/>
</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-04-19T18:04:21.347886" elapsed="0.000232"/>
</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-04-19T18:04:21.348255" 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-04-19T18:04:21.348907" elapsed="0.000131"/>
</kw>
<msg time="2026-04-19T18:04:21.349123" level="INFO">${price_float} = 80.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-04-19T18:04:21.348533" elapsed="0.000616"/>
</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-04-19T18:04:21.349276" elapsed="0.000278"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证单个Ticker价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.346852" elapsed="0.002766"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.350474" 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-04-19T18:04:21.350308" elapsed="0.000190"/>
</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-04-19T18:04:21.350592" elapsed="0.000183"/>
</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-04-19T18:04:21.350879" elapsed="0.000117"/>
</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-04-19T18:04:21.351280" elapsed="0.000109"/>
</kw>
<msg time="2026-04-19T18:04:21.351467" level="INFO">${amount_float} = 15823628</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-04-19T18:04:21.351103" elapsed="0.000386"/>
</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-04-19T18:04:21.351598" elapsed="0.000228"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.349756" elapsed="0.002122"/>
</kw>
<kw name="验证单个Ticker数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.352718" 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-04-19T18:04:21.352547" elapsed="0.000195"/>
</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-04-19T18:04:21.352836" elapsed="0.000183"/>
</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-04-19T18:04:21.353123" 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-04-19T18:04:21.353537" elapsed="0.000109"/>
</kw>
<msg time="2026-04-19T18:04:21.353716" level="INFO">${amount_float} = 131982690</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-04-19T18:04:21.353360" elapsed="0.000384"/>
</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-04-19T18:04:21.353850" elapsed="0.000229"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证单个Ticker数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.352004" elapsed="0.002128"/>
</kw>
<kw name="验证单个Ticker涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.354962" 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-04-19T18:04:21.354794" elapsed="0.000193"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:21.355081" elapsed="0.000156"/>
</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-04-19T18:04:21.355368" elapsed="0.000115"/>
</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-04-19T18:04:21.355779" elapsed="0.000107"/>
</kw>
<msg time="2026-04-19T18:04:21.355956" level="INFO">${rate_float} = 0.0706</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-04-19T18:04:21.355596" elapsed="0.000382"/>
</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-04-19T18:04:21.356084" elapsed="0.000236"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证单个Ticker涨跌幅格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.354260" elapsed="0.002114"/>
</kw>
<arg>${ticker_data}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-04-19T18:04:21.330649" elapsed="0.025771"/>
</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-04-19T18:04:21.356522" elapsed="0.000460"/>
</kw>
<doc>验证期货U本位单个Ticker接口功能（SOL交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:21.081066" elapsed="0.276030"/>
</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-04-19T18:04:21.359820" 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-04-19T18:04:21.359287" elapsed="0.000558"/>
</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-04-19T18:04:21.360361" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:21.359944" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:21.359927" elapsed="0.000502"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:21.360458" elapsed="0.000023"/>
</return>
<msg time="2026-04-19T18:04:21.360613" 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-04-19T18:04:21.358709" elapsed="0.001926"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:21.563991" 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-04-19T18:04:21.564375" 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': 'Sun, 19 Apr 2026 10:04:21 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '0686a83dac78f1690c1c4708d04946dd', 'X-Transparent': '00-0686a83dac78f1690c1c4708d04946dd-3b43f2be38f90ca8-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': '9eeb15aa2c8f20f1-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":[]},"data":null,"ts":1776593061521} 
 </msg>
<msg time="2026-04-19T18:04:21.564551" 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-04-19T18:04:21.564944" 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-04-19T18:04:21.361042" elapsed="0.203962"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:21.565219" elapsed="0.000122"/>
</return>
<msg time="2026-04-19T18:04:21.565705" 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-04-19T18:04:21.360755" elapsed="0.205005"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.567050" 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-04-19T18:04:21.566186" elapsed="0.000947"/>
</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-04-19T18:04:21.567305" elapsed="0.000623"/>
</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-04-19T18:04:21.568071" elapsed="0.000554"/>
</kw>
<doc>验证期货U本位单个Ticker接口对无效交易对的处理</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:21.357271" elapsed="0.211532"/>
</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-04-19T18:04:21.573534" 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-04-19T18:04:21.572695" elapsed="0.000876"/>
</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-04-19T18:04:21.574582" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:21.573772" elapsed="0.000909"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:21.573731" elapsed="0.000998"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:21.574793" elapsed="0.000057"/>
</return>
<msg time="2026-04-19T18:04:21.575123" 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-04-19T18:04:21.571752" elapsed="0.003414"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:21.844624" 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-04-19T18:04:21.844959" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/future-u/market/public/q/ticker 
 status=200, reason=OK 
 headers={'Date': 'Sun, 19 Apr 2026 10:04:21 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9997', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '719504a97d2f6814edfbccbb400db3cc', 'X-Transparent': '00-719504a97d2f6814edfbccbb400db3cc-db0189feabbab5d9-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': '9eeb15ab8df820f1-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":1,"msg":"failure","msgInfo":{"code":"invalid_symbol","template":"无效交易对","args":["symbol"]},"data":null,"ts":1776593061736} 
 </msg>
<msg time="2026-04-19T18:04:21.845150" 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-04-19T18:04:21.845474" 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-04-19T18:04:21.576424" elapsed="0.269096"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:21.845701" elapsed="0.000110"/>
</return>
<msg time="2026-04-19T18:04:21.846108" 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-04-19T18:04:21.575471" elapsed="0.270675"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.847505" 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-04-19T18:04:21.846487" elapsed="0.001129"/>
</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-04-19T18:04:21.847845" elapsed="0.000646"/>
</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-04-19T18:04:21.848626" elapsed="0.000587"/>
</kw>
<doc>验证期货U本位单个Ticker接口对缺少symbol参数的处理</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:21.569086" elapsed="0.280333"/>
</test>
<doc>期货U本位单个Ticker接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:20.006188" elapsed="1.843746"/>
</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-04-19T18:04:21.856419" 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-04-19T18:04:21.856222" elapsed="0.000226"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.857125" 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-04-19T18:04:21.856759" elapsed="0.000409"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:21.856546" elapsed="0.000653"/>
</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-04-19T18:04:21.857315" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:21.857225" elapsed="0.000135"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:21.856519" elapsed="0.000865"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.858003" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:21.857901" elapsed="0.000141"/>
</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-04-19T18:04:21.858247" 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-04-19T18:04:21.858358" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:21.858465" 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-04-19T18:04:21.858569" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:21.858675" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:21.858098" elapsed="0.000622"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:21.858873" 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-04-19T18:04:21.858979" 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-04-19T18:04:21.859087" 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-04-19T18:04:21.859187" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:21.859292" 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-04-19T18:04:21.859390" 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-04-19T18:04:21.859490" 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-04-19T18:04:21.859595" 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-04-19T18:04:21.859804" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:21.858741" elapsed="0.001151"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.860324" 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-04-19T18:04:21.860040" elapsed="0.000332"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.860724" 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-04-19T18:04:21.860489" elapsed="0.000279"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.861111" 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-04-19T18:04:21.860884" elapsed="0.000270"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.861500" 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-04-19T18:04:21.861272" elapsed="0.000271"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.861897" 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-04-19T18:04:21.861659" elapsed="0.000281"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.862302" 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-04-19T18:04:21.862065" elapsed="0.000279"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.862709" 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-04-19T18:04:21.862458" elapsed="0.000295"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.863149" 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-04-19T18:04:21.862908" elapsed="0.000284"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.863561" 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-04-19T18:04:21.863307" elapsed="0.000297"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:21.859924" elapsed="0.003717"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:21.858084" elapsed="0.005584"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.863962" 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-04-19T18:04:21.863780" elapsed="0.000231"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:21.864435" 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-04-19T18:04:21.864130" elapsed="0.000487"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:21.857669" elapsed="0.007023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:21.864907" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:21.864811" elapsed="0.000140"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:21.855948" elapsed="0.009061"/>
</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-04-19T18:04:21.867830" 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-04-19T18:04:21.867152" 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-04-19T18:04:21.868437" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:21.867971" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:21.867954" elapsed="0.000557"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:21.868539" elapsed="0.000026"/>
</return>
<msg time="2026-04-19T18:04:21.868717" 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-04-19T18:04:21.866333" elapsed="0.002408"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:22.706990" 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-04-19T18:04:22.707405" 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': 'Sun, 19 Apr 2026 10:04:22 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': 'c769bbcaa39fef05998040f9fd9bb1fe', 'X-Transparent': '00-c769bbcaa39fef05998040f9fd9bb1fe-eb1f2644e86c0073-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': '9eeb15b148d91052-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":[{"t":1776593061919,"s":"btc_usdt","c":"75005.60","h":"76400.00","l":"74828.10","a":"63352266","v":"479633366","o":"76368.70","r":"-0.0178"},{"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":1771066846936,"s":"sol_usdt","c":"85.79","h":"86.36","l":"79.68","a":"15823628","v":"131982690","o":"80.13","r":"0.0706"},{"t":1776593060776,"s":"doge_usdt","c":"0.09363","h":"0.09677","l":"0.09341","a":"36322568","v":"34525103","o":"0.09665","r":"-0.0312"}],"ts":1776593062669} 
 </msg>
<msg time="2026-04-19T18:04:22.707596" 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-04-19T18:04:22.708009" 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-04-19T18:04:21.869197" elapsed="0.838878"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:22.708415" elapsed="0.000128"/>
</return>
<msg time="2026-04-19T18:04:22.708933" 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-04-19T18:04:21.868866" elapsed="0.840126"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.711643" 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-04-19T18:04:22.710401" elapsed="0.001922"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.713243" 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-04-19T18:04:22.712531" elapsed="0.000745"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.713616" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:22.713431" elapsed="0.000240"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:22.709565" elapsed="0.004189"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.714490" 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-04-19T18:04:22.713898" elapsed="0.000641"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.715185" level="INFO">${tickers_list} = [{'t': 1776593061919, 's': 'btc_usdt', 'c': '75005.60', 'h': '76400.00', 'l': '74828.10', 'a': '63352266', 'v': '479633366', 'o': '76368.70', 'r': '-0.0178'}, {'t': 1771066847342, 's': 'eth_usdt', 'c'...</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-04-19T18:04:22.714659" elapsed="0.000558"/>
</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-04-19T18:04:22.716164" elapsed="0.000151"/>
</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-04-19T18:04:22.716432" elapsed="0.000139"/>
</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-04-19T18:04:22.716688" elapsed="0.000142"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:22.716940" elapsed="0.000139"/>
</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-04-19T18:04:22.717192" elapsed="0.000138"/>
</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-04-19T18:04:22.717441" elapsed="0.000138"/>
</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-04-19T18:04:22.717689" elapsed="0.000138"/>
</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-04-19T18:04:22.717935" elapsed="0.000134"/>
</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-04-19T18:04:22.718181" elapsed="0.000138"/>
</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-04-19T18:04:22.719212" 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-04-19T18:04:22.719605" elapsed="0.000180"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.720105" level="INFO">${timestamp_str} = 1776593061919</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:22.719904" elapsed="0.000230"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.720365" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:22.720445" 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-04-19T18:04:22.720251" elapsed="0.000219"/>
</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-04-19T18:04:22.720583" elapsed="0.000262"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.718495" elapsed="0.002419"/>
</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-04-19T18:04:22.721745" elapsed="0.000141"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.722104" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-04-19T18:04:22.721998" elapsed="0.000147"/>
</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-04-19T18:04:22.722235" elapsed="0.000116"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.721066" elapsed="0.001336"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.723358" 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-04-19T18:04:22.723172" elapsed="0.000213"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.723487" elapsed="0.000204"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.723961" elapsed="0.000141"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.722529" elapsed="0.001634"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.725312" 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-04-19T18:04:22.724873" elapsed="0.000464"/>
</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-04-19T18:04:22.725435" elapsed="0.000195"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.725740" elapsed="0.000116"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.724287" elapsed="0.001637"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.726692" 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-04-19T18:04:22.726551" elapsed="0.000162"/>
</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-04-19T18:04:22.726798" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.727055" elapsed="0.000104"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.726039" elapsed="0.001172"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.727964" 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-04-19T18:04:22.727821" elapsed="0.000163"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.728071" elapsed="0.000157"/>
</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-04-19T18:04:22.728316" elapsed="0.000096"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.727317" elapsed="0.001144"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.729272" 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-04-19T18:04:22.729116" elapsed="0.000179"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.729390" elapsed="0.000182"/>
</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-04-19T18:04:22.729675" elapsed="0.000115"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.728562" elapsed="0.001291"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.730641" 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-04-19T18:04:22.730487" elapsed="0.000175"/>
</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-04-19T18:04:22.730749" elapsed="0.000164"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.731001" elapsed="0.000098"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.729957" elapsed="0.001191"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.731944" 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-04-19T18:04:22.731791" elapsed="0.000175"/>
</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-04-19T18:04:22.732048" elapsed="0.000149"/>
</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-04-19T18:04:22.732304" elapsed="0.000104"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.731270" elapsed="0.001190"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.715820" elapsed="0.016688"/>
</kw>
<var name="${ticker}">{'t': 1776593061919, 's': 'btc_usdt', 'c': '75005.60', 'h': '76400.00', 'l': '74828.10', 'a': '63352266', 'v': '479633366', 'o': '76368.70', 'r': '-0.0178'}</var>
<status status="PASS" start="2026-04-19T18:04:22.715530" elapsed="0.017087"/>
</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-04-19T18:04:22.733149" elapsed="0.000121"/>
</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-04-19T18:04:22.733357" elapsed="0.000101"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>c</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:22.733542" elapsed="0.000102"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:22.733726" elapsed="0.000239"/>
</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-04-19T18:04:22.734200" elapsed="0.000239"/>
</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-04-19T18:04:22.734574" elapsed="0.000164"/>
</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-04-19T18:04:22.734857" elapsed="0.000148"/>
</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-04-19T18:04:22.735120" elapsed="0.000148"/>
</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-04-19T18:04:22.735381" 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-04-19T18:04:22.736485" elapsed="0.000443"/>
</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-04-19T18:04:22.737057" elapsed="0.000198"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.737608" 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-04-19T18:04:22.737384" elapsed="0.000256"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.737877" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:22.737944" 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-04-19T18:04:22.737761" elapsed="0.000205"/>
</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-04-19T18:04:22.738061" elapsed="0.000231"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.735721" elapsed="0.002631"/>
</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-04-19T18:04:22.739054" elapsed="0.000126"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.739380" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-04-19T18:04:22.739276" elapsed="0.000142"/>
</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-04-19T18:04:22.739513" elapsed="0.000123"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.738477" elapsed="0.001210"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.740570" 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-04-19T18:04:22.740394" elapsed="0.000200"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.740691" 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-04-19T18:04:22.741003" elapsed="0.000127"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.739805" elapsed="0.001382"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.742057" 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-04-19T18:04:22.741885" elapsed="0.000195"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.742177" elapsed="0.000187"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.742471" elapsed="0.000120"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.741307" elapsed="0.001346"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.743506" 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-04-19T18:04:22.743337" elapsed="0.000193"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.743625" 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-04-19T18:04:22.743970" elapsed="0.000123"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.742770" elapsed="0.001381"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.745010" 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-04-19T18:04:22.744836" elapsed="0.000198"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.745132" elapsed="0.000191"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.745430" elapsed="0.000122"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.744267" elapsed="0.001343"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.746354" 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-04-19T18:04:22.746209" elapsed="0.000166"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.746458" elapsed="0.000163"/>
</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-04-19T18:04:22.746711" elapsed="0.000104"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.745722" elapsed="0.001142"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.747590" 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-04-19T18:04:22.747446" elapsed="0.000164"/>
</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-04-19T18:04:22.747692" elapsed="0.000158"/>
</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-04-19T18:04:22.747940" elapsed="0.000104"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.746964" elapsed="0.001131"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.748927" 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-04-19T18:04:22.748673" elapsed="0.000274"/>
</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-04-19T18:04:22.749030" elapsed="0.000143"/>
</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-04-19T18:04:22.749263" elapsed="0.000101"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.748196" elapsed="0.001218"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.732929" elapsed="0.016526"/>
</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-04-19T18:04:22.732761" elapsed="0.016722"/>
</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-04-19T18:04:22.749929" elapsed="0.000105"/>
</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-04-19T18:04:22.750117" elapsed="0.000103"/>
</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-04-19T18:04:22.750298" elapsed="0.000101"/>
</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-04-19T18:04:22.750482" elapsed="0.000096"/>
</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-04-19T18:04:22.750659" 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-04-19T18:04:22.750837" 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-04-19T18:04:22.751016" elapsed="0.000100"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:22.751197" elapsed="0.000097"/>
</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-04-19T18:04:22.751375" 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-04-19T18:04:22.752080" elapsed="0.000143"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.752309" elapsed="0.000130"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.752662" level="INFO">${timestamp_str} = 1771066846936</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:22.752525" elapsed="0.000157"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.752852" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:22.752910" 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-04-19T18:04:22.752766" elapsed="0.000163"/>
</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-04-19T18:04:22.753010" elapsed="0.000184"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.751608" elapsed="0.001633"/>
</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-04-19T18:04:22.753782" elapsed="0.000097"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.754029" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-04-19T18:04:22.753950" elapsed="0.000109"/>
</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-04-19T18:04:22.754128" elapsed="0.000090"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.753339" elapsed="0.000918"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.754898" 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-04-19T18:04:22.754766" elapsed="0.000150"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.754988" elapsed="0.000141"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.755209" elapsed="0.000087"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.754342" elapsed="0.000998"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.755975" 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-04-19T18:04:22.755847" elapsed="0.000146"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.756063" elapsed="0.000142"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.756286" elapsed="0.000090"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.755428" elapsed="0.000991"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.757144" 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-04-19T18:04:22.757018" 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-04-19T18:04:22.757235" elapsed="0.000141"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.757456" elapsed="0.000091"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.756506" elapsed="0.001086"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.758169" 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-04-19T18:04:22.758057" elapsed="0.000128"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.758251" 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-04-19T18:04:22.758452" elapsed="0.000080"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.757672" elapsed="0.000899"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.759163" 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-04-19T18:04:22.759049" elapsed="0.000130"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.759244" elapsed="0.000159"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.759479" elapsed="0.000084"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.758649" elapsed="0.000953"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.760195" 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-04-19T18:04:22.760081" elapsed="0.000131"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.760275" elapsed="0.000128"/>
</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-04-19T18:04:22.760476" elapsed="0.000082"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.759681" elapsed="0.000916"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.761160" 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-04-19T18:04:22.761046" elapsed="0.000130"/>
</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-04-19T18:04:22.761241" elapsed="0.000108"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.761418" elapsed="0.000078"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.760676" elapsed="0.000859"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.749713" elapsed="0.011857"/>
</kw>
<var name="${ticker}">{'t': 1771066846936, 's': 'sol_usdt', 'c': '85.79', 'h': '86.36', 'l': '79.68', 'a': '15823628', 'v': '131982690', 'o': '80.13', 'r': '0.0706'}</var>
<status status="PASS" start="2026-04-19T18:04:22.749571" elapsed="0.012017"/>
</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-04-19T18:04:22.761926" elapsed="0.000084"/>
</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-04-19T18:04:22.762075" elapsed="0.000085"/>
</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-04-19T18:04:22.762227" 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-04-19T18:04:22.762372" elapsed="0.000081"/>
</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-04-19T18:04:22.762516" elapsed="0.000081"/>
</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-04-19T18:04:22.762660" elapsed="0.000080"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:22.762803" elapsed="0.000081"/>
</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-04-19T18:04:22.762946" elapsed="0.000080"/>
</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-04-19T18:04:22.763087" elapsed="0.000086"/>
</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-04-19T18:04:22.763629" elapsed="0.000113"/>
</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-04-19T18:04:22.763808" elapsed="0.000101"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.764781" level="INFO">${timestamp_str} = 1776593060776</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:22.763977" elapsed="0.000821"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.764942" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:22.764988" 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-04-19T18:04:22.764867" elapsed="0.000135"/>
</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-04-19T18:04:22.765068" elapsed="0.000145"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.763259" elapsed="0.001991"/>
</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-04-19T18:04:22.765682" elapsed="0.000074"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.765881" level="INFO">Length is 9.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-04-19T18:04:22.765814" elapsed="0.000090"/>
</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-04-19T18:04:22.765962" elapsed="0.000075"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.765327" elapsed="0.000757"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.766605" 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-04-19T18:04:22.766502" 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-04-19T18:04:22.766678" elapsed="0.000116"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.766860" elapsed="0.000072"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.766154" elapsed="0.000814"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.767491" 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-04-19T18:04:22.767387" 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-04-19T18:04:22.767565" elapsed="0.000118"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.767748" elapsed="0.000075"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.767040" elapsed="0.000819"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.768382" 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-04-19T18:04:22.768277" 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-04-19T18:04:22.768457" 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-04-19T18:04:22.768648" elapsed="0.000075"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.767929" elapsed="0.000829"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.769282" 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-04-19T18:04:22.769178" 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-04-19T18:04:22.769355" 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-04-19T18:04:22.769537" elapsed="0.000073"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.768830" elapsed="0.000816"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.770176" 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-04-19T18:04:22.770071" elapsed="0.000121"/>
</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-04-19T18:04:22.770252" elapsed="0.000122"/>
</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-04-19T18:04:22.770440" elapsed="0.000075"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.769718" elapsed="0.000833"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.771076" 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-04-19T18:04:22.770972" 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-04-19T18:04:22.771150" 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-04-19T18:04:22.771330" elapsed="0.000075"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.770622" elapsed="0.000819"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:22.771953" 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-04-19T18:04:22.771848" elapsed="0.000120"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:22.772027" elapsed="0.000113"/>
</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-04-19T18:04:22.772207" elapsed="0.000146"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.771513" elapsed="0.000878"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-04-19T18:04:22.761757" elapsed="0.010663"/>
</kw>
<var name="${ticker}">{'t': 1776593060776, 's': 'doge_usdt', 'c': '0.09363', 'h': '0.09677', 'l': '0.09341', 'a': '36322568', 'v': '34525103', 'o': '0.09665', 'r': '-0.0312'}</var>
<status status="PASS" start="2026-04-19T18:04:22.761650" elapsed="0.010787"/>
</iter>
<var>${ticker}</var>
<value>@{tickers_list}</value>
<status status="PASS" start="2026-04-19T18:04:22.715309" elapsed="0.057144"/>
</for>
<doc>验证期货U本位Tickers接口功能</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:21.865076" elapsed="0.907458"/>
</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-04-19T18:04:22.774333" 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-04-19T18:04:22.773966" elapsed="0.000383"/>
</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-04-19T18:04:22.774706" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:22.774421" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:22.774409" elapsed="0.000343"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:22.774769" elapsed="0.000019"/>
</return>
<msg time="2026-04-19T18:04:22.774881" 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-04-19T18:04:22.773561" elapsed="0.001335"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:23.093179" 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-04-19T18:04:23.093617" 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': 'Sun, 19 Apr 2026 10:04:23 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9999', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '7d504f07778612274ad4d3647974299a', 'X-Transparent': '00-7d504f07778612274ad4d3647974299a-e47922cdeb46bf26-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': '9eeb15b3ba261052-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":[{"t":1776593061919,"s":"btc_usdt","c":"75005.60","h":"76400.00","l":"74828.10","a":"63352266","v":"479633366","o":"76368.70","r":"-0.0178"},{"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":1771066846936,"s":"sol_usdt","c":"85.79","h":"86.36","l":"79.68","a":"15823628","v":"131982690","o":"80.13","r":"0.0706"},{"t":1776593060776,"s":"doge_usdt","c":"0.09363","h":"0.09677","l":"0.09341","a":"36322568","v":"34525103","o":"0.09665","r":"-0.0312"}],"ts":1776593063055} 
 </msg>
<msg time="2026-04-19T18:04:23.093827" 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-04-19T18:04:23.094286" 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-04-19T18:04:22.775173" elapsed="0.319185"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:23.094610" elapsed="0.000176"/>
</return>
<msg time="2026-04-19T18:04:23.095264" 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-04-19T18:04:22.774973" elapsed="0.320354"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.098273" 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-04-19T18:04:23.096956" elapsed="0.001481"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.099973" 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-04-19T18:04:23.098881" elapsed="0.001148"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.100584" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:23.100292" elapsed="0.000395"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:23.096002" elapsed="0.004816"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.102164" 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-04-19T18:04:23.101059" elapsed="0.001204"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.103502" level="INFO">${tickers_list} = [{'t': 1776593061919, 's': 'btc_usdt', 'c': '75005.60', 'h': '76400.00', 'l': '74828.10', 'a': '63352266', 'v': '479633366', 'o': '76368.70', 'r': '-0.0178'}, {'t': 1771066847342, 's': 'eth_usdt', 'c'...</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-04-19T18:04:23.102506" elapsed="0.001042"/>
</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-04-19T18:04:23.104904" elapsed="0.000229"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:23.105313" elapsed="0.000204"/>
</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-04-19T18:04:23.105684" elapsed="0.000198"/>
</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-04-19T18:04:23.106053" elapsed="0.000209"/>
</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-04-19T18:04:23.106425" elapsed="0.000198"/>
</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-04-19T18:04:23.106787" elapsed="0.000188"/>
</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-04-19T18:04:23.107138" elapsed="0.000151"/>
</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-04-19T18:04:23.107423" elapsed="0.000160"/>
</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-04-19T18:04:23.107707" elapsed="0.000162"/>
</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-04-19T18:04:23.109289" elapsed="0.000321"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.109754" elapsed="0.000208"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.110314" level="INFO">${timestamp_str} = 1776593061919</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:23.110102" elapsed="0.000244"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.110624" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:23.110711" 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-04-19T18:04:23.110487" elapsed="0.000253"/>
</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-04-19T18:04:23.110868" elapsed="0.000297"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.108071" elapsed="0.003161"/>
</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-04-19T18:04:23.112068" elapsed="0.000143"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.112468" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-04-19T18:04:23.112334" elapsed="0.000184"/>
</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-04-19T18:04:23.112638" elapsed="0.000149"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.111397" elapsed="0.001455"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.113921" 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-04-19T18:04:23.113719" elapsed="0.000229"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.114055" elapsed="0.000232"/>
</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-04-19T18:04:23.114431" elapsed="0.000154"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.113009" elapsed="0.001644"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.115601" 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-04-19T18:04:23.115436" elapsed="0.000188"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.115771" elapsed="0.000193"/>
</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-04-19T18:04:23.116069" elapsed="0.000114"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.114790" elapsed="0.001451"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.117107" 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-04-19T18:04:23.116939" elapsed="0.000191"/>
</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-04-19T18:04:23.117229" 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-04-19T18:04:23.117535" elapsed="0.000120"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.116356" elapsed="0.001359"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.118613" 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-04-19T18:04:23.118441" elapsed="0.000197"/>
</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-04-19T18:04:23.118743" elapsed="0.000209"/>
</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-04-19T18:04:23.119061" elapsed="0.000112"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.117840" elapsed="0.001394"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.120033" 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-04-19T18:04:23.119888" elapsed="0.000167"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.120142" elapsed="0.000163"/>
</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-04-19T18:04:23.120393" elapsed="0.000097"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.119350" elapsed="0.001193"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.121340" 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-04-19T18:04:23.121196" elapsed="0.000164"/>
</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-04-19T18:04:23.121441" elapsed="0.000323"/>
</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-04-19T18:04:23.121856" elapsed="0.000105"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.120651" elapsed="0.001362"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.122796" 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-04-19T18:04:23.122636" elapsed="0.000186"/>
</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-04-19T18:04:23.122907" elapsed="0.000143"/>
</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-04-19T18:04:23.123141" elapsed="0.000296"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.122122" elapsed="0.001413"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.104431" elapsed="0.019162"/>
</kw>
<var name="${ticker}">{'t': 1776593061919, 's': 'btc_usdt', 'c': '75005.60', 'h': '76400.00', 'l': '74828.10', 'a': '63352266', 'v': '479633366', 'o': '76368.70', 'r': '-0.0178'}</var>
<status status="PASS" start="2026-04-19T18:04:23.104009" elapsed="0.019618"/>
</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-04-19T18:04:23.124318" 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-04-19T18:04:23.124595" elapsed="0.000143"/>
</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-04-19T18:04:23.124855" elapsed="0.000181"/>
</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-04-19T18:04:23.125154" elapsed="0.000138"/>
</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-04-19T18:04:23.125408" elapsed="0.000141"/>
</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-04-19T18:04:23.125666" elapsed="0.000149"/>
</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-04-19T18:04:23.125927" elapsed="0.000142"/>
</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-04-19T18:04:23.126183" elapsed="0.000146"/>
</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-04-19T18:04:23.126446" elapsed="0.000155"/>
</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-04-19T18:04:23.127402" elapsed="0.000179"/>
</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-04-19T18:04:23.127680" elapsed="0.000152"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.128098" 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-04-19T18:04:23.127935" elapsed="0.000188"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.128321" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:23.128386" 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-04-19T18:04:23.128220" elapsed="0.000186"/>
</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-04-19T18:04:23.128500" elapsed="0.000211"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.126754" elapsed="0.002013"/>
</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-04-19T18:04:23.129430" elapsed="0.000121"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.129741" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-04-19T18:04:23.129642" elapsed="0.000137"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:23.129871" elapsed="0.000121"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.128882" elapsed="0.001160"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.130884" 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-04-19T18:04:23.130711" elapsed="0.000197"/>
</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-04-19T18:04:23.131000" elapsed="0.000191"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.131299" elapsed="0.000120"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.130155" elapsed="0.001323"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.132322" 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-04-19T18:04:23.132154" elapsed="0.000192"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.132440" elapsed="0.000316"/>
</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-04-19T18:04:23.132863" elapsed="0.000121"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.131594" elapsed="0.001447"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.133886" 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-04-19T18:04:23.133717" elapsed="0.000193"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.134006" elapsed="0.000189"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.134302" elapsed="0.000120"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.133156" elapsed="0.001324"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.135289" 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-04-19T18:04:23.135142" elapsed="0.000192"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.135420" 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-04-19T18:04:23.135674" elapsed="0.000104"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.134594" elapsed="0.001234"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.136554" 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-04-19T18:04:23.136410" elapsed="0.000165"/>
</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-04-19T18:04:23.136658" elapsed="0.000161"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.136909" elapsed="0.000104"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.135926" elapsed="0.001137"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.137787" 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-04-19T18:04:23.137643" elapsed="0.000164"/>
</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-04-19T18:04:23.137890" elapsed="0.000162"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.138143" elapsed="0.000103"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.137162" elapsed="0.001132"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.139003" 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-04-19T18:04:23.138857" elapsed="0.000167"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.139107" elapsed="0.000139"/>
</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-04-19T18:04:23.139336" elapsed="0.000100"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.138393" elapsed="0.001092"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.123985" elapsed="0.015540"/>
</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-04-19T18:04:23.123756" elapsed="0.015792"/>
</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-04-19T18:04:23.139974" elapsed="0.000104"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:23.140162" elapsed="0.000102"/>
</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-04-19T18:04:23.140344" elapsed="0.000103"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:23.140524" 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-04-19T18:04:23.140706" elapsed="0.000099"/>
</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-04-19T18:04:23.140886" 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-04-19T18:04:23.141067" elapsed="0.000097"/>
</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-04-19T18:04:23.141244" elapsed="0.000100"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>r</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:23.141425" elapsed="0.000101"/>
</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-04-19T18:04:23.142102" elapsed="0.000236"/>
</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-04-19T18:04:23.142424" elapsed="0.000134"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.142772" level="INFO">${timestamp_str} = 1771066846936</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:23.142641" elapsed="0.000152"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.142980" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:23.143035" 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-04-19T18:04:23.142894" elapsed="0.000157"/>
</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-04-19T18:04:23.143122" elapsed="0.000163"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.141633" elapsed="0.001695"/>
</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-04-19T18:04:23.143824" elapsed="0.000091"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.144061" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-04-19T18:04:23.143985" elapsed="0.000104"/>
</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-04-19T18:04:23.144158" elapsed="0.000091"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.143414" elapsed="0.000873"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.144926" 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-04-19T18:04:23.144798" elapsed="0.000147"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.145016" elapsed="0.000143"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.145243" elapsed="0.000093"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.144373" elapsed="0.001009"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.146032" 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-04-19T18:04:23.145903" elapsed="0.000148"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.146130" elapsed="0.000152"/>
</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-04-19T18:04:23.146369" elapsed="0.000097"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.145472" elapsed="0.001039"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.147146" 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-04-19T18:04:23.147031" elapsed="0.000131"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.147230" elapsed="0.000128"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.147430" elapsed="0.000081"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.146602" elapsed="0.000950"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.148133" 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-04-19T18:04:23.148018" elapsed="0.000131"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.148215" 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-04-19T18:04:23.148420" elapsed="0.000079"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.147632" elapsed="0.000906"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.149110" 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-04-19T18:04:23.148998" elapsed="0.000129"/>
</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-04-19T18:04:23.149192" elapsed="0.000126"/>
</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-04-19T18:04:23.149390" elapsed="0.000082"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.148617" elapsed="0.000895"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.150114" 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-04-19T18:04:23.149977" elapsed="0.000154"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${amount_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.150198" elapsed="0.000142"/>
</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-04-19T18:04:23.150416" elapsed="0.000083"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.149591" elapsed="0.000948"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.151199" 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-04-19T18:04:23.150993" elapsed="0.000223"/>
</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-04-19T18:04:23.151283" elapsed="0.000111"/>
</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-04-19T18:04:23.151463" elapsed="0.000081"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.150619" elapsed="0.000965"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.139764" elapsed="0.011851"/>
</kw>
<var name="${ticker}">{'t': 1771066846936, 's': 'sol_usdt', 'c': '85.79', 'h': '86.36', 'l': '79.68', 'a': '15823628', 'v': '131982690', 'o': '80.13', 'r': '0.0706'}</var>
<status status="PASS" start="2026-04-19T18:04:23.139622" elapsed="0.012012"/>
</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-04-19T18:04:23.151964" elapsed="0.000082"/>
</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-04-19T18:04:23.152116" elapsed="0.000080"/>
</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-04-19T18:04:23.152262" elapsed="0.000081"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:23.152407" elapsed="0.000082"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>l</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:23.152552" 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-04-19T18:04:23.152697" 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-04-19T18:04:23.152839" elapsed="0.000081"/>
</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-04-19T18:04:23.152983" elapsed="0.000085"/>
</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-04-19T18:04:23.153131" elapsed="0.000082"/>
</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-04-19T18:04:23.153674" elapsed="0.000113"/>
</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-04-19T18:04:23.153854" elapsed="0.000101"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.154130" level="INFO">${timestamp_str} = 1776593060776</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:23.154024" elapsed="0.000122"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.154280" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:23.154325" 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-04-19T18:04:23.154212" elapsed="0.000128"/>
</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-04-19T18:04:23.154407" elapsed="0.000142"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.153297" elapsed="0.001288"/>
</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-04-19T18:04:23.155002" elapsed="0.000071"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.155202" level="INFO">Length is 9.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-04-19T18:04:23.155132" elapsed="0.000094"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${symbol}</arg>
<arg>_</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:23.155282" elapsed="0.000073"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.154664" elapsed="0.000724"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.155916" 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-04-19T18:04:23.155810" 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-04-19T18:04:23.155992" elapsed="0.000116"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.156188" elapsed="0.000078"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.155461" elapsed="0.000841"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.156832" 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-04-19T18:04:23.156726" 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-04-19T18:04:23.156907" elapsed="0.000123"/>
</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-04-19T18:04:23.157095" elapsed="0.000075"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.156374" elapsed="0.000831"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.157795" 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-04-19T18:04:23.157685" elapsed="0.000124"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.157869" 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-04-19T18:04:23.158052" elapsed="0.000074"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.157277" elapsed="0.000885"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.158687" 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-04-19T18:04:23.158583" 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-04-19T18:04:23.158755" elapsed="0.000107"/>
</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-04-19T18:04:23.158925" elapsed="0.000072"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.158233" elapsed="0.000798"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.159520" 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-04-19T18:04:23.159422" 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-04-19T18:04:23.159589" elapsed="0.000108"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.159758" elapsed="0.000073"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.159096" elapsed="0.000768"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.160351" 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-04-19T18:04:23.160253" 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-04-19T18:04:23.160419" elapsed="0.000106"/>
</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-04-19T18:04:23.160586" elapsed="0.000070"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.159931" elapsed="0.000758"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.161164" 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-04-19T18:04:23.161068" elapsed="0.000110"/>
</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-04-19T18:04:23.161233" elapsed="0.000090"/>
</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-04-19T18:04:23.161383" elapsed="0.000068"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.160756" elapsed="0.000728"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.151795" elapsed="0.009715"/>
</kw>
<var name="${ticker}">{'t': 1776593060776, 's': 'doge_usdt', 'c': '0.09363', 'h': '0.09677', 'l': '0.09341', 'a': '36322568', 'v': '34525103', 'o': '0.09665', 'r': '-0.0312'}</var>
<status status="PASS" start="2026-04-19T18:04:23.151688" elapsed="0.009849"/>
</iter>
<var>${ticker}</var>
<value>@{tickers_list}</value>
<status status="PASS" start="2026-04-19T18:04:23.103683" elapsed="0.057870"/>
</for>
<doc>验证期货U本位Tickers接口功能（仅预测交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:22.772659" elapsed="0.388970"/>
</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-04-19T18:04:23.163372" 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-04-19T18:04:23.163003" elapsed="0.000385"/>
</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-04-19T18:04:23.163740" elapsed="0.000010"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:23.163458" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:23.163446" elapsed="0.000338"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:23.163801" elapsed="0.000019"/>
</return>
<msg time="2026-04-19T18:04:23.163911" 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-04-19T18:04:23.162600" elapsed="0.001325"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:23.417391" 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-04-19T18:04:23.417778" 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': 'Sun, 19 Apr 2026 10:04:23 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-RateLimit-Remaining': '9998', 'X-RateLimit-Requested-Tokens': '1', 'X-RateLimit-Burst-Capacity': '10000', 'X-RateLimit-Replenish-Rate': '10000', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '0801ae4d7bcf035a6470183910e8c762', 'X-Transparent': '00-0801ae4d7bcf035a6470183910e8c762-403f073d29709a36-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': '9eeb15b57b221052-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":null,"data":[{"t":1776593061919,"s":"btc_usdt","c":"75005.60","h":"76400.00","l":"74828.10","a":"63352266","v":"479633366","o":"76368.70","r":"-0.0178"},{"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":1771066846936,"s":"sol_usdt","c":"85.79","h":"86.36","l":"79.68","a":"15823628","v":"131982690","o":"80.13","r":"0.0706"},{"t":1776593060776,"s":"doge_usdt","c":"0.09363","h":"0.09677","l":"0.09341","a":"36322568","v":"34525103","o":"0.09665","r":"-0.0312"}],"ts":1776593063334} 
 </msg>
<msg time="2026-04-19T18:04:23.417964" 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-04-19T18:04:23.418423" 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-04-19T18:04:23.164199" elapsed="0.254285"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:23.418694" elapsed="0.000115"/>
</return>
<msg time="2026-04-19T18:04:23.419165" 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-04-19T18:04:23.164000" elapsed="0.255219"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.421869" 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-04-19T18:04:23.420598" elapsed="0.001429"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.423613" 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-04-19T18:04:23.422320" elapsed="0.001368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.424355" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:23.424018" elapsed="0.000451"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:23.419765" elapsed="0.005091"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.425954" 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-04-19T18:04:23.425039" elapsed="0.000991"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.427017" level="INFO">${tickers_list} = [{'t': 1776593061919, 's': 'btc_usdt', 'c': '75005.60', 'h': '76400.00', 'l': '74828.10', 'a': '63352266', 'v': '479633366', 'o': '76368.70', 'r': '-0.0178'}, {'t': 1771066847342, 's': 'eth_usdt', 'c'...</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-04-19T18:04:23.426209" elapsed="0.000852"/>
</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-04-19T18:04:23.428873" elapsed="0.000188"/>
</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-04-19T18:04:23.429204" elapsed="0.000160"/>
</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-04-19T18:04:23.429489" elapsed="0.000153"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>h</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:23.429769" elapsed="0.000148"/>
</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-04-19T18:04:23.430040" elapsed="0.000164"/>
</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-04-19T18:04:23.430330" elapsed="0.000152"/>
</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-04-19T18:04:23.430607" elapsed="0.000148"/>
</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-04-19T18:04:23.430883" elapsed="0.000156"/>
</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-04-19T18:04:23.431171" elapsed="0.000153"/>
</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-04-19T18:04:23.432359" elapsed="0.000290"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>${timestamp} &gt; 0</arg>
<arg>时间戳应该大于0</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.432771" elapsed="0.000186"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.433267" level="INFO">${timestamp_str} = 1776593061919</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:23.433077" elapsed="0.000217"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.433523" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:23.433595" 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-04-19T18:04:23.433413" elapsed="0.000206"/>
</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-04-19T18:04:23.433726" elapsed="0.000256"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.431527" elapsed="0.002532"/>
</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-04-19T18:04:23.434900" elapsed="0.000147"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.435270" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-04-19T18:04:23.435153" elapsed="0.000162"/>
</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-04-19T18:04:23.435418" elapsed="0.000133"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.434231" elapsed="0.001380"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.436611" 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-04-19T18:04:23.436422" elapsed="0.000213"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.436730" elapsed="0.000200"/>
</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-04-19T18:04:23.437046" elapsed="0.000133"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.435760" elapsed="0.001486"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.438192" 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-04-19T18:04:23.438015" elapsed="0.000203"/>
</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-04-19T18:04:23.438317" elapsed="0.000203"/>
</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-04-19T18:04:23.438633" elapsed="0.000117"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.437390" elapsed="0.003858"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.442780" 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-04-19T18:04:23.442300" elapsed="0.000509"/>
</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-04-19T18:04:23.442919" elapsed="0.000218"/>
</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-04-19T18:04:23.443252" elapsed="0.000120"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.441507" elapsed="0.001934"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.444366" 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-04-19T18:04:23.444201" elapsed="0.000192"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.444492" elapsed="0.000186"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.444780" elapsed="0.000111"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.443579" elapsed="0.001375"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.445809" 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-04-19T18:04:23.445648" elapsed="0.000185"/>
</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-04-19T18:04:23.445930" elapsed="0.000188"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.446226" elapsed="0.000114"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.445085" elapsed="0.001319"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.447281" 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-04-19T18:04:23.447118" elapsed="0.000186"/>
</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-04-19T18:04:23.447395" elapsed="0.000183"/>
</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-04-19T18:04:23.447681" elapsed="0.000110"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.446529" elapsed="0.001318"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.448630" 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-04-19T18:04:23.448488" elapsed="0.000162"/>
</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-04-19T18:04:23.448733" elapsed="0.000134"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${rate_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${rate}.replace('.', '').replace('-', '').isdigit() or ${rate} == '0'</arg>
<arg>涨跌幅字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.448970" elapsed="0.000101"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.447977" elapsed="0.001150"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.428419" elapsed="0.020752"/>
</kw>
<var name="${ticker}">{'t': 1776593061919, 's': 'btc_usdt', 'c': '75005.60', 'h': '76400.00', 'l': '74828.10', 'a': '63352266', 'v': '479633366', 'o': '76368.70', 'r': '-0.0178'}</var>
<status status="PASS" start="2026-04-19T18:04:23.427482" elapsed="0.021720"/>
</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-04-19T18:04:23.449718" elapsed="0.000115"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>s</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:23.449914" elapsed="0.000096"/>
</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-04-19T18:04:23.450091" elapsed="0.000094"/>
</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-04-19T18:04:23.450262" elapsed="0.000094"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>l</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:23.450435" elapsed="0.000094"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>a</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:23.450608" elapsed="0.000102"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:23.450839" elapsed="0.000099"/>
</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-04-19T18:04:23.451025" elapsed="0.000104"/>
</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-04-19T18:04:23.451207" elapsed="0.000095"/>
</kw>
<kw name="验证Ticker时间戳格式">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance(${timestamp}, int)</arg>
<arg>时间戳应该是整数</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.451897" elapsed="0.000255"/>
</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-04-19T18:04:23.452254" elapsed="0.000097"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.452483" 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-04-19T18:04:23.452401" elapsed="0.000094"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.452596" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:23.452680" 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-04-19T18:04:23.452538" elapsed="0.000168"/>
</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-04-19T18:04:23.452822" elapsed="0.000481"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.451418" elapsed="0.001962"/>
</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-04-19T18:04:23.454175" elapsed="0.000053"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.454312" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-04-19T18:04:23.454267" 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-04-19T18:04:23.454366" elapsed="0.000051"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.453555" elapsed="0.000883"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.455214" 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-04-19T18:04:23.454990" elapsed="0.000254"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.455362" elapsed="0.000241"/>
</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-04-19T18:04:23.455741" elapsed="0.000140"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.454486" elapsed="0.001420"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.456298" 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-04-19T18:04:23.456229" elapsed="0.000079"/>
</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-04-19T18:04:23.456347" elapsed="0.000079"/>
</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-04-19T18:04:23.456469" elapsed="0.000049"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.455957" elapsed="0.000584"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.456891" 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-04-19T18:04:23.456823" 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-04-19T18:04:23.456939" elapsed="0.000076"/>
</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-04-19T18:04:23.457059" elapsed="0.000051"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.456588" elapsed="0.000545"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.457476" 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-04-19T18:04:23.457408" elapsed="0.000077"/>
</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-04-19T18:04:23.457523" elapsed="0.000074"/>
</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-04-19T18:04:23.457639" elapsed="0.000050"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.457181" elapsed="0.000553"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.458311" 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-04-19T18:04:23.458210" 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-04-19T18:04:23.458359" 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-04-19T18:04:23.458477" elapsed="0.000049"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.457781" elapsed="0.000768"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.458896" 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-04-19T18:04:23.458822" elapsed="0.000097"/>
</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-04-19T18:04:23.459019" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${amount_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${amount}.replace('.', '').isdigit() or ${amount} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.459324" elapsed="0.000121"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.458595" elapsed="0.000907"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.460348" 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-04-19T18:04:23.460187" elapsed="0.000171"/>
</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-04-19T18:04:23.460399" elapsed="0.000067"/>
</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-04-19T18:04:23.460507" elapsed="0.000100"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.459622" elapsed="0.001008"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.449504" elapsed="0.011148"/>
</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-04-19T18:04:23.449332" elapsed="0.011331"/>
</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-04-19T18:04:23.460866" elapsed="0.000050"/>
</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-04-19T18:04:23.460956" elapsed="0.000050"/>
</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-04-19T18:04:23.461058" elapsed="0.000049"/>
</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-04-19T18:04:23.461145" elapsed="0.000048"/>
</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-04-19T18:04:23.461231" elapsed="0.000053"/>
</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-04-19T18:04:23.461333" elapsed="0.000047"/>
</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-04-19T18:04:23.461419" elapsed="0.000102"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:23.461580" 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-04-19T18:04:23.461700" elapsed="0.000060"/>
</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-04-19T18:04:23.462128" elapsed="0.000089"/>
</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-04-19T18:04:23.462263" elapsed="0.000113"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.462546" level="INFO">${timestamp_str} = 1771066846936</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:23.462468" elapsed="0.000089"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.462641" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:23.462669" 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-04-19T18:04:23.462598" elapsed="0.000080"/>
</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-04-19T18:04:23.462720" elapsed="0.000090"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.461838" elapsed="0.001016"/>
</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-04-19T18:04:23.463158" elapsed="0.000053"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.463295" level="INFO">Length is 8.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-04-19T18:04:23.463252" elapsed="0.000060"/>
</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-04-19T18:04:23.463351" elapsed="0.000051"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.462910" elapsed="0.000516"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.463820" 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-04-19T18:04:23.463713" elapsed="0.000129"/>
</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-04-19T18:04:23.463928" 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-04-19T18:04:23.464207" elapsed="0.000115"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.463476" elapsed="0.000899"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.464863" 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-04-19T18:04:23.464778" elapsed="0.000097"/>
</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-04-19T18:04:23.464922" 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-04-19T18:04:23.465075" elapsed="0.000061"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.464485" elapsed="0.000679"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.466666" 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-04-19T18:04:23.466577" elapsed="0.000101"/>
</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-04-19T18:04:23.466728" elapsed="0.000095"/>
</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-04-19T18:04:23.466877" elapsed="0.000061"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.465223" elapsed="0.001743"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.467539" 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-04-19T18:04:23.467392" 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-04-19T18:04:23.467646" elapsed="0.000169"/>
</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-04-19T18:04:23.467913" elapsed="0.000107"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.467026" elapsed="0.001044"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.468745" 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-04-19T18:04:23.468661" elapsed="0.000096"/>
</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-04-19T18:04:23.468804" elapsed="0.000091"/>
</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-04-19T18:04:23.468946" elapsed="0.000059"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.468172" elapsed="0.000861"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.469451" 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-04-19T18:04:23.469364" elapsed="0.000099"/>
</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-04-19T18:04:23.469551" 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-04-19T18:04:23.469815" elapsed="0.000107"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.469091" elapsed="0.000908"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.470729" 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-04-19T18:04:23.470577" elapsed="0.000172"/>
</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-04-19T18:04:23.470796" elapsed="0.000079"/>
</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-04-19T18:04:23.470927" elapsed="0.000060"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.470107" elapsed="0.000910"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.460765" elapsed="0.010274"/>
</kw>
<var name="${ticker}">{'t': 1771066846936, 's': 'sol_usdt', 'c': '85.79', 'h': '86.36', 'l': '79.68', 'a': '15823628', 'v': '131982690', 'o': '80.13', 'r': '0.0706'}</var>
<status status="PASS" start="2026-04-19T18:04:23.460700" elapsed="0.010353"/>
</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-04-19T18:04:23.471301" 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-04-19T18:04:23.471412" 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-04-19T18:04:23.471518" elapsed="0.000058"/>
</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-04-19T18:04:23.471625" elapsed="0.000072"/>
</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-04-19T18:04:23.471779" elapsed="0.000095"/>
</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-04-19T18:04:23.471949" elapsed="0.000094"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>v</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:23.472117" elapsed="0.000094"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>o</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:23.472285" elapsed="0.000094"/>
</kw>
<kw name="Should Contain" owner="BuiltIn">
<arg>${ticker}</arg>
<arg>r</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:23.472453" 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-04-19T18:04:23.472857" elapsed="0.000086"/>
</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-04-19T18:04:23.472992" elapsed="0.000078"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.473196" level="INFO">${timestamp_str} = 1776593060776</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:23.473118" elapsed="0.000090"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.473306" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:23.473339" 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-04-19T18:04:23.473256" elapsed="0.000094"/>
</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-04-19T18:04:23.473395" elapsed="0.000165"/>
</kw>
<arg>${ticker['t']}</arg>
<doc>验证Ticker时间戳格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.472593" elapsed="0.000996"/>
</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-04-19T18:04:23.473912" elapsed="0.000073"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.474100" level="INFO">Length is 9.</msg>
<arg>${symbol}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-04-19T18:04:23.474040" elapsed="0.000080"/>
</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-04-19T18:04:23.474167" elapsed="0.000064"/>
</kw>
<arg>${ticker['s']}</arg>
<doc>验证交易对符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.473647" elapsed="0.000610"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.474696" 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-04-19T18:04:23.474610" elapsed="0.000098"/>
</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-04-19T18:04:23.474754" 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-04-19T18:04:23.474945" elapsed="0.000063"/>
</kw>
<arg>${ticker['c']}</arg>
<arg>最新价格</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.474316" elapsed="0.000721"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.475448" 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-04-19T18:04:23.475366" 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-04-19T18:04:23.475524" elapsed="0.000092"/>
</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-04-19T18:04:23.475687" elapsed="0.000091"/>
</kw>
<arg>${ticker['h']}</arg>
<arg>最高价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.475094" elapsed="0.000729"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.476475" 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-04-19T18:04:23.476345" elapsed="0.000148"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${price_type}' in ['str', 'int', 'float']</arg>
<arg>${field_name}应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.476566" elapsed="0.000144"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${price_type}' == 'str'</arg>
<arg>Should Be True</arg>
<arg>${price}.replace('.', '').replace('-', '').isdigit() or ${price} == '0'</arg>
<arg>${field_name}字符串应该是有效数字格式</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.476792" elapsed="0.000091"/>
</kw>
<arg>${ticker['l']}</arg>
<arg>最低价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.475913" elapsed="0.001015"/>
</kw>
<kw name="验证价格字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.477414" 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-04-19T18:04:23.477322" 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-04-19T18:04:23.477479" elapsed="0.000100"/>
</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-04-19T18:04:23.477653" elapsed="0.000091"/>
</kw>
<arg>${ticker['o']}</arg>
<arg>开盘价</arg>
<doc>验证价格字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.477008" elapsed="0.000780"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.478451" 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-04-19T18:04:23.478324" elapsed="0.000146"/>
</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-04-19T18:04:23.478545" elapsed="0.000142"/>
</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-04-19T18:04:23.478766" elapsed="0.000092"/>
</kw>
<arg>${ticker['a']}</arg>
<arg>成交额</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.477880" elapsed="0.001023"/>
</kw>
<kw name="验证数量字段格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.479406" 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-04-19T18:04:23.479316" elapsed="0.000103"/>
</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-04-19T18:04:23.479471" elapsed="0.000100"/>
</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-04-19T18:04:23.479630" elapsed="0.000083"/>
</kw>
<arg>${ticker['v']}</arg>
<arg>成交量</arg>
<doc>验证数量字段格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.478990" elapsed="0.000763"/>
</kw>
<kw name="验证涨跌幅格式">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.480314" 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-04-19T18:04:23.480199" elapsed="0.000132"/>
</kw>
<kw name="Should Be True" owner="BuiltIn">
<arg>'${rate_type}' in ['str', 'int', 'float']</arg>
<arg>涨跌幅应该是字符串或数字类型</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:23.480395" elapsed="0.000107"/>
</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-04-19T18:04:23.480574" elapsed="0.000080"/>
</kw>
<arg>${ticker['r']}</arg>
<doc>验证涨跌幅格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.479832" elapsed="0.000860"/>
</kw>
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="PASS" start="2026-04-19T18:04:23.471177" elapsed="0.009547"/>
</kw>
<var name="${ticker}">{'t': 1776593060776, 's': 'doge_usdt', 'c': '0.09363', 'h': '0.09677', 'l': '0.09341', 'a': '36322568', 'v': '34525103', 'o': '0.09665', 'r': '-0.0312'}</var>
<status status="PASS" start="2026-04-19T18:04:23.471096" elapsed="0.009646"/>
</iter>
<var>${ticker}</var>
<value>@{tickers_list}</value>
<status status="PASS" start="2026-04-19T18:04:23.427181" elapsed="0.053579"/>
</for>
<doc>验证期货U本位Tickers接口功能（仅交割交易对）</doc>
<tag>future-u</tag>
<status status="PASS" start="2026-04-19T18:04:23.161744" elapsed="0.319104"/>
</test>
<doc>期货U本位Tickers接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:21.851442" elapsed="1.629605"/>
</suite>
<status status="PASS" start="2026-04-19T18:04:11.099820" elapsed="12.381854"/>
</suite>
<status status="PASS" start="2026-04-19T18:04:10.019272" elapsed="13.462929"/>
</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-04-19T18:04:23.486255" 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-04-19T18:04:23.486145" elapsed="0.000127"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.486502" 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-04-19T18:04:23.486428" elapsed="0.000099"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:23.486320" elapsed="0.000229"/>
</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-04-19T18:04:23.486620" elapsed="0.000011"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:23.486564" elapsed="0.000085"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:23.486307" elapsed="0.000354"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.487030" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:23.486959" elapsed="0.000096"/>
</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-04-19T18:04:23.487179" 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-04-19T18:04:23.487250" 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-04-19T18:04:23.487316" 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-04-19T18:04:23.487380" 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-04-19T18:04:23.487438" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:23.487091" elapsed="0.000370"/>
</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-04-19T18:04:23.487547" 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-04-19T18:04:23.487604" 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-04-19T18:04:23.487661" 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-04-19T18:04:23.487715" 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-04-19T18:04:23.487770" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:23.487825" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:23.487879" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:23.487932" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:23.487986" elapsed="0.000009"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:23.487472" elapsed="0.000538"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.488169" 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-04-19T18:04:23.488065" elapsed="0.000124"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.488342" 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-04-19T18:04:23.488242" elapsed="0.000123"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.488541" 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-04-19T18:04:23.488427" elapsed="0.000136"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.488735" 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-04-19T18:04:23.488624" elapsed="0.000133"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.488935" 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-04-19T18:04:23.488817" elapsed="0.000140"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.489132" 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-04-19T18:04:23.489017" elapsed="0.000137"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.489356" 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-04-19T18:04:23.489231" elapsed="0.000148"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.489556" 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-04-19T18:04:23.489441" elapsed="0.000134"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.489735" 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-04-19T18:04:23.489629" elapsed="0.000125"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:23.488021" elapsed="0.001750"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:23.487082" elapsed="0.002700"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.489910" 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-04-19T18:04:23.489829" elapsed="0.000103"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:23.490144" 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-04-19T18:04:23.489987" elapsed="0.000314"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:23.486818" elapsed="0.003518"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.490435" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:23.490390" elapsed="0.000066"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:23.486017" elapsed="0.004466"/>
</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-04-19T18:04:23.491103" elapsed="0.000116"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.491373" 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-04-19T18:04:23.491277" elapsed="0.000110"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.491543" 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-04-19T18:04:23.491449" elapsed="0.000108"/>
</kw>
<if>
<branch type="IF" condition="'${access_token}' == '${EMPTY}' or '${refresh_token}' == '${EMPTY}'">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.492125" 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-04-19T18:04:23.492036" elapsed="0.000102"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.492282" 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-04-19T18:04:23.492193" elapsed="0.000101"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-19T18:04:23.492501" level="INFO" html="true">File '&lt;a href="file:///Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_bitradex_test.json"&gt;/Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_bitradex_test.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-04-19T18:04:23.492420" elapsed="0.000106"/>
</kw>
<msg time="2026-04-19T18:04:23.492566" level="INFO">${token_file_exists} = True</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-04-19T18:04:23.492350" elapsed="0.000228"/>
</kw>
<if>
<branch type="IF" condition="not ${token_file_exists}">
<kw name="Set Variable" owner="BuiltIn">
<var>${token_file}</var>
<arg>${TOKEN_FILE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:23.492697" elapsed="0.000011"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<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="NOT RUN" start="2026-04-19T18:04:23.492764" elapsed="0.000009"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:23.492613" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:23.492604" elapsed="0.000199"/>
</if>
<if>
<branch type="IF" condition="not ${token_file_exists}">
<kw name="Set Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-04-19T18:04:23.492911" elapsed="0.000010"/>
</kw>
<kw name="File Should Exist" owner="OperatingSystem">
<arg>${token_file}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:23.492972" elapsed="0.000009"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:23.492829" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:23.492821" elapsed="0.000186"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-19T18:04:23.493127" level="INFO" html="true">Getting file '&lt;a href="file:///Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_bitradex_test.json"&gt;/Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_bitradex_test.json&lt;/a&gt;'.</msg>
<msg time="2026-04-19T18:04:23.493796" level="INFO">${token_text} = {
  "accessToken": "eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI2NTM0MDE4NjE2OSIsInN1YiI6Im4wMTlAeW9wbWFpbC5uZXQiLCJzY29wZSI6ImF1dGgiLCJsYXN0QXV0aFRpbWUiOjE3NzYzNDczNzYyMzUsInNpZ25UeXBlIjoiVVAiLCJhY2NvdW5...</msg>
<var>${token_text}</var>
<arg>${token_file}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-19T18:04:23.493054" elapsed="0.000756"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.494012" level="INFO">${token_json} = {'accessToken': 'eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI2NTM0MDE4NjE2OSIsInN1YiI6Im4wMTlAeW9wbWFpbC5uZXQiLCJzY29wZSI6ImF1dGgiLCJsYXN0QXV0aFRpbWUiOjE3NzYzNDczNzYyMzUsInNpZ25UeXBlIjoiVVAiLCJhY2NvdW50TG...</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-04-19T18:04:23.493866" elapsed="0.000173"/>
</kw>
<if>
<branch type="IF" condition="'${access_token}' == '${EMPTY}'">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:23.494435" level="INFO">${access_token} = eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI2NTM0MDE4NjE2OSIsInN1YiI6Im4wMTlAeW9wbWFpbC5uZXQiLCJzY29wZSI6ImF1dGgiLCJsYXN0QXV0aFRpbWUiOjE3NzYzNDczNzYyMzUsInNpZ25UeXBlIjoiVVAiLCJhY2NvdW50TGV2ZWwiOiIxIiwidXN...</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-04-19T18:04:23.494348" elapsed="0.000101"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:23.494075" elapsed="0.000393"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:23.494067" elapsed="0.000413"/>
</if>
<if>
<branch type="IF" condition="'${refresh_token}' == '${EMPTY}'">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:23.494861" level="INFO">${refresh_token} = eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI2NTM0MDE4NjE2OSIsInN1YiI6Im4wMTlAeW9wbWFpbC5uZXQiLCJzY29wZSI6InJlZnJlc2giLCJsYXN0QXV0aFRpbWUiOjE3NzYzNDczNzYyMzUsInNpZ25UeXBlIjoiVVAiLCJhY2NvdW50TGV2ZWwiOiIxIiw...</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-04-19T18:04:23.494774" elapsed="0.000101"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:23.494506" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:23.494498" elapsed="0.000407"/>
</if>
<status status="PASS" start="2026-04-19T18:04:23.491593" elapsed="0.003323"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:23.491584" elapsed="0.003343"/>
</if>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.495044" level="INFO">Length is 540.</msg>
<arg>${access_token}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-04-19T18:04:23.494976" elapsed="0.000089"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.495174" level="INFO">Length is 544.</msg>
<arg>${refresh_token}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-04-19T18:04:23.495116" elapsed="0.000086"/>
</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-04-19T18:04:23.495257" elapsed="0.000073"/>
</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-04-19T18:04:23.495388" elapsed="0.000067"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.495596" 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-04-19T18:04:23.495522" elapsed="0.000087"/>
</kw>
<if>
<branch type="IF" condition="'${user_id}' == '${EMPTY}'">
<kw name="Split String" owner="String">
<msg time="2026-04-19T18:04:23.496000" level="INFO">${parts} = ['eyJhbGciOiJSUzI1NiJ9', 'eyJhY2NvdW50SWQiOiI2NTM0MDE4NjE2OSIsInN1YiI6Im4wMTlAeW9wbWFpbC5uZXQiLCJzY29wZSI6ImF1dGgiLCJsYXN0QXV0aFRpbWUiOjE3NzYzNDczNzYyMzUsInNpZ25UeXBlIjoiVVAiLCJhY2NvdW50TGV2ZWwiOiIxIi...</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-04-19T18:04:23.495913" elapsed="0.000101"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.496344" level="INFO">${payload_b64} = eyJhY2NvdW50SWQiOiI2NTM0MDE4NjE2OSIsInN1YiI6Im4wMTlAeW9wbWFpbC5uZXQiLCJzY29wZSI6ImF1dGgiLCJsYXN0QXV0aFRpbWUiOjE3NzYzNDczNzYyMzUsInNpZ25UeXBlIjoiVVAiLCJhY2NvdW50TGV2ZWwiOiIxIiwidXNlck5hbWUiOiJuMDE5QHlv...</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-04-19T18:04:23.496067" elapsed="0.000291"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.496645" level="INFO">${payload} = {'accountId': '65340186169', 'sub': 'n019@yopmail.net', 'scope': 'auth', 'lastAuthTime': 1776347376235, 'signType': 'UP', 'accountLevel': '1', 'userName': 'n019@yopmail.net', 'exp': 1776433776, 'devic...</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-04-19T18:04:23.496412" elapsed="0.000248"/>
</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-04-19T18:04:23.496787" elapsed="0.000072"/>
</kw>
<msg time="2026-04-19T18:04:23.496901" 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-04-19T18:04:23.496717" elapsed="0.000196"/>
</kw>
<if>
<branch type="IF" condition="${has_user_id}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.497291" level="INFO">${user_id} = 65340186169</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-04-19T18:04:23.497014" elapsed="0.000291"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:23.496947" elapsed="0.000377"/>
</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-04-19T18:04:23.497390" elapsed="0.000009"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:23.497337" elapsed="0.000080"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:23.496940" elapsed="0.000487"/>
</if>
<status status="PASS" start="2026-04-19T18:04:23.495642" elapsed="0.001796"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:23.495634" elapsed="0.001815"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.497588" level="INFO">${user_id} = 65340186169</msg>
<var>${user_id}</var>
<arg>${user_id}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:23.497496" elapsed="0.000105"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.497791" level="INFO">&amp;{params} = { user-id=65340186169 }</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-04-19T18:04:23.497662" elapsed="0.000143"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:23.498510" 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-04-19T18:04:23.498147" elapsed="0.000379"/>
</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-04-19T18:04:23.498882" elapsed="0.000119"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:23.498591" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:23.498582" elapsed="0.000451"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:23.499050" elapsed="0.000018"/>
</return>
<msg time="2026-04-19T18:04:23.499157" 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-04-19T18:04:23.497907" elapsed="0.001263"/>
</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-04-19T18:04:23.499226" elapsed="0.000088"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:24.152506" level="INFO">GET Request : url=https://app.bitradex-test.com/v1/invite/public/user-team/profit/user?user-id=65340186169 
 path_url=/v1/invite/public/user-team/profit/user?user-id=65340186169 
 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.eyJhY2NvdW50SWQiOiI2NTM0MDE4NjE2OSIsInN1YiI6Im4wMTlAeW9wbWFpbC5uZXQiLCJzY29wZSI6ImF1dGgiLCJsYXN0QXV0aFRpbWUiOjE3NzYzNDczNzYyMzUsInNpZ25UeXBlIjoiVVAiLCJhY2NvdW50TGV2ZWwiOiIxIiwidXNlck5hbWUiOiJuMDE5QHlvcG1haWwubmV0IiwiZXhwIjoxNzc2NDMzNzc2LCJkZXZpY2UiOiJhcHAiLCJ1c2VySWQiOjY1MzQwMTg2MTY5LCJ1c2VyQ29kZSI6IjllOWFlMmRjNGZiMDcwYjhmMjY3MWRmNTQyYzBmNWNjIn0.Yfb24htZ0T-V99afB8n0spcQLkGodZMzDp4v_GvsielgzxhbGZ3TqQ_HvX8JGPMyEfKb0a6bIv7e70d8Eiz4C2yoKaSGdBZI2q_y5S_XJs7wRstzgBCJliU7e6lJCpnd4Ivav9n1z_z4nh_p0NXfAY1WjXvkCZ3x-oBuX5NzR7U', 'token': 'eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI2NTM0MDE4NjE2OSIsInN1YiI6Im4wMTlAeW9wbWFpbC5uZXQiLCJzY29wZSI6ImF1dGgiLCJsYXN0QXV0aFRpbWUiOjE3NzYzNDczNzYyMzUsInNpZ25UeXBlIjoiVVAiLCJhY2NvdW50TGV2ZWwiOiIxIiwidXNlck5hbWUiOiJuMDE5QHlvcG1haWwubmV0IiwiZXhwIjoxNzc2NDMzNzc2LCJkZXZpY2UiOiJhcHAiLCJ1c2VySWQiOjY1MzQwMTg2MTY5LCJ1c2VyQ29kZSI6IjllOWFlMmRjNGZiMDcwYjhmMjY3MWRmNTQyYzBmNWNjIn0.Yfb24htZ0T-V99afB8n0spcQLkGodZMzDp4v_GvsielgzxhbGZ3TqQ_HvX8JGPMyEfKb0a6bIv7e70d8Eiz4C2yoKaSGdBZI2q_y5S_XJs7wRstzgBCJliU7e6lJCpnd4Ivav9n1z_z4nh_p0NXfAY1WjXvkCZ3x-oBuX5NzR7U', 'uid': '65340186169'} 
 body=None 
 </msg>
<msg time="2026-04-19T18:04:24.152980" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/invite/public/user-team/profit/user?user-id=65340186169 
 status=200, reason=OK 
 headers={'Date': 'Sun, 19 Apr 2026 10:04:24 GMT', 'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Connection': 'keep-alive', 'X-Frame-Options': 'SAMEORIGIN', 'Speculation-Rules': '"/cdn-cgi/speculation"', 'Vary': 'Origin, Access-Control-Request-Method, Access-Control-Request-Headers', 'X-Forwarded-For': '141.11.146.71', 'X-Trace-ID': '069b0abd3062b2547d5f91222d6241d0', 'X-Transparent': '00-069b0abd3062b2547d5f91222d6241d0-bbfba94e6b6b8dce-01', 'X-Upstream-Addr': '10.9.149.153:8080', 'X-Upstream-Header-Time': '0.002', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': '9eeb15ba48f40ef8-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":401,"msg":"登录失效，请重试","msgInfo":{"template":"Token expire."},"ts":1776593064104} 
 </msg>
<msg time="2026-04-19T18:04:24.153188" 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-04-19T18:04:24.153647" 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-04-19T18:04:23.499369" elapsed="0.654352"/>
</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-04-19T18:04:24.154887" elapsed="0.001608"/>
</kw>
<msg time="2026-04-19T18:04:24.156711" 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-04-19T18:04:24.154375" elapsed="0.002390"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.158341" 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-04-19T18:04:24.157053" elapsed="0.001348"/>
</kw>
<if>
<branch type="IF" condition="${has_code}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.160266" 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-04-19T18:04:24.159016" elapsed="0.001306"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:24.158655" elapsed="0.001746"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:24.158586" elapsed="0.001891"/>
</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-04-19T18:04:24.164019" level="INFO">Token已过期，尝试使用refreshToken刷新...</msg>
<arg>Token已过期，尝试使用refreshToken刷新...</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:24.163858" elapsed="0.000241"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.166741" 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-04-19T18:04:24.165642" elapsed="0.001137"/>
</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-04-19T18:04:24.167674" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:24.166956" elapsed="0.000792"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:24.166927" elapsed="0.000854"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:24.167841" elapsed="0.000062"/>
</return>
<msg time="2026-04-19T18:04:24.168149" 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-04-19T18:04:24.164394" elapsed="0.003789"/>
</kw>
<kw name="POST On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:24.466692" level="INFO">POST Request : url=https://app.bitradex-test.com/v1/uaa/authorize/token/refresh?refreshToken=eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI2NTM0MDE4NjE2OSIsInN1YiI6Im4wMTlAeW9wbWFpbC5uZXQiLCJzY29wZSI6InJlZnJlc2giLCJsYXN0QXV0aFRpbWUiOjE3NzYzNDczNzYyMzUsInNpZ25UeXBlIjoiVVAiLCJhY2NvdW50TGV2ZWwiOiIxIiwidXNlck5hbWUiOiJuMDE5QHlvcG1haWwubmV0IiwiZXhwIjoxNzc4OTM5Mzc2LCJkZXZpY2UiOiJhcHAiLCJ1c2VySWQiOjY1MzQwMTg2MTY5LCJ1c2VyQ29kZSI6IjllOWFlMmRjNGZiMDcwYjhmMjY3MWRmNTQyYzBmNWNjIn0.h_lR7FihVcXYXAg6_Lu2glTvqqjeepxSRi9vC8f7kccJsGzZH8_ewrCC3sC2ZdiX76wQFYgYz59sDMOKCZr2aKBP880WdXWNuA2W5VLe_NGjaqPPuiOOMQEk4Ml9au3yUBZJUbuzgUoLW_g1yDRmpOHnfZvTTowpexJwO6dwJW0 
 path_url=/v1/uaa/authorize/token/refresh?refreshToken=eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI2NTM0MDE4NjE2OSIsInN1YiI6Im4wMTlAeW9wbWFpbC5uZXQiLCJzY29wZSI6InJlZnJlc2giLCJsYXN0QXV0aFRpbWUiOjE3NzYzNDczNzYyMzUsInNpZ25UeXBlIjoiVVAiLCJhY2NvdW50TGV2ZWwiOiIxIiwidXNlck5hbWUiOiJuMDE5QHlvcG1haWwubmV0IiwiZXhwIjoxNzc4OTM5Mzc2LCJkZXZpY2UiOiJhcHAiLCJ1c2VySWQiOjY1MzQwMTg2MTY5LCJ1c2VyQ29kZSI6IjllOWFlMmRjNGZiMDcwYjhmMjY3MWRmNTQyYzBmNWNjIn0.h_lR7FihVcXYXAg6_Lu2glTvqqjeepxSRi9vC8f7kccJsGzZH8_ewrCC3sC2ZdiX76wQFYgYz59sDMOKCZr2aKBP880WdXWNuA2W5VLe_NGjaqPPuiOOMQEk4Ml9au3yUBZJUbuzgUoLW_g1yDRmpOHnfZvTTowpexJwO6dwJW0 
 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-04-19T18:04:24.467148" level="INFO">POST Response : url=https://app.bitradex-test.com/v1/uaa/authorize/token/refresh?refreshToken=eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI2NTM0MDE4NjE2OSIsInN1YiI6Im4wMTlAeW9wbWFpbC5uZXQiLCJzY29wZSI6InJlZnJlc2giLCJsYXN0QXV0aFRpbWUiOjE3NzYzNDczNzYyMzUsInNpZ25UeXBlIjoiVVAiLCJhY2NvdW50TGV2ZWwiOiIxIiwidXNlck5hbWUiOiJuMDE5QHlvcG1haWwubmV0IiwiZXhwIjoxNzc4OTM5Mzc2LCJkZXZpY2UiOiJhcHAiLCJ1c2VySWQiOjY1MzQwMTg2MTY5LCJ1c2VyQ29kZSI6IjllOWFlMmRjNGZiMDcwYjhmMjY3MWRmNTQyYzBmNWNjIn0.h_lR7FihVcXYXAg6_Lu2glTvqqjeepxSRi9vC8f7kccJsGzZH8_ewrCC3sC2ZdiX76wQFYgYz59sDMOKCZr2aKBP880WdXWNuA2W5VLe_NGjaqPPuiOOMQEk4Ml9au3yUBZJUbuzgUoLW_g1yDRmpOHnfZvTTowpexJwO6dwJW0 
 status=200, reason=OK 
 headers={'Date': 'Sun, 19 Apr 2026 10:04:24 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': '141.11.146.71', 'X-Trace-ID': '5f7a9d8b57e9e44659a301a05042f665', 'X-Transparent': '00-5f7a9d8b57e9e44659a301a05042f665-f5cc618c98e63423-01', 'X-Upstream-Addr': '10.9.149.153:8080', 'X-Upstream-Header-Time': '0.019', 'X-Upstream-Service': 'default-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': '9eeb15bbb9980ef8-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":910,"msg":"废弃的token","msgInfo":{"template":"废弃的token"},"ts":1776593064377} 
 </msg>
<msg time="2026-04-19T18:04:24.467365" 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-04-19T18:04:24.467801" 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-04-19T18:04:24.168337" elapsed="0.299538"/>
</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-04-19T18:04:24.471024" elapsed="0.000076"/>
</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-04-19T18:04:24.471356" elapsed="0.000037"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>Token刷新成功！</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:24.471677" elapsed="0.000029"/>
</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-04-19T18:04:24.471888" elapsed="0.000026"/>
</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-04-19T18:04:24.472082" elapsed="0.000029"/>
</kw>
<kw name="获取统一请求头" owner="common">
<var>${new_headers}</var>
<arg>token=${new_access_token}</arg>
<doc>获取统一的应用请求头配置</doc>
<status status="NOT RUN" start="2026-04-19T18:04:24.472591" elapsed="0.000067"/>
</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-04-19T18:04:24.472861" elapsed="0.000029"/>
</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-04-19T18:04:24.473204" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:24.473027" elapsed="0.000264"/>
</branch>
<status status="NOT RUN" start="2026-04-19T18:04:24.472991" elapsed="0.000358"/>
</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-04-19T18:04:24.473604" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:24.473439" elapsed="0.000263"/>
</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-04-19T18:04:24.473898" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:24.473741" elapsed="0.000250"/>
</branch>
<status status="NOT RUN" start="2026-04-19T18:04:24.473413" elapsed="0.000616"/>
</if>
<return>
<value>${final_resp}</value>
<status status="NOT RUN" start="2026-04-19T18:04:24.474093" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-19T18:04:24.468296" elapsed="0.005884"/>
</branch>
<branch type="ELSE">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.475664" level="FAIL">Token刷新失败: {"code":910,"msg":"废弃的token","msgInfo":{"template":"废弃的token"},"ts":1776593064377}</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-04-19T18:04:24.474369" elapsed="0.001442">Token刷新失败: {"code":910,"msg":"废弃的token","msgInfo":{"template":"废弃的token"},"ts":1776593064377}</status>
</kw>
<status status="FAIL" start="2026-04-19T18:04:24.474218" elapsed="0.001721">Token刷新失败: {"code":910,"msg":"废弃的token","msgInfo":{"template":"废弃的token"},"ts":1776593064377}</status>
</branch>
<status status="FAIL" start="2026-04-19T18:04:24.468176" elapsed="0.007809">Token刷新失败: {"code":910,"msg":"废弃的token","msgInfo":{"template":"废弃的token"},"ts":1776593064377}</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-04-19T18:04:24.162985" elapsed="0.313177">Token刷新失败: {"code":910,"msg":"废弃的token","msgInfo":{"template":"废弃的token"},"ts":1776593064377}</status>
</kw>
<msg time="2026-04-19T18:04:24.476393" level="INFO">${refresh_status} = FAIL</msg>
<msg time="2026-04-19T18:04:24.476473" level="INFO">${refresh_result} = Token刷新失败: {"code":910,"msg":"废弃的token","msgInfo":{"template":"废弃的token"},"ts":1776593064377}</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-04-19T18:04:24.162066" elapsed="0.314451"/>
</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-04-19T18:04:24.476965" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:24.476661" elapsed="0.000395"/>
</branch>
<branch type="ELSE">
<kw name="Skip" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.477588" level="SKIP">Token已失效且refreshToken不可用: Token刷新失败: {"code":910,"msg":"废弃的token","msgInfo":{"template":"废弃的token"},"ts":1776593064377}</msg>
<arg>Token已失效且refreshToken不可用: ${refresh_result}</arg>
<doc>Skips the rest of the current test.</doc>
<status status="SKIP" start="2026-04-19T18:04:24.477242" elapsed="0.000460">Token已失效且refreshToken不可用: Token刷新失败: {"code":910,"msg":"废弃的token","msgInfo":{"template":"废弃的token"},"ts":1776593064377}</status>
</kw>
<status status="SKIP" start="2026-04-19T18:04:24.477095" elapsed="0.000700">Token已失效且refreshToken不可用: Token刷新失败: {"code":910,"msg":"废弃的token","msgInfo":{"template":"废弃的token"},"ts":1776593064377}</status>
</branch>
<status status="SKIP" start="2026-04-19T18:04:24.476631" elapsed="0.001208">Token已失效且refreshToken不可用: Token刷新失败: {"code":910,"msg":"废弃的token","msgInfo":{"template":"废弃的token"},"ts":1776593064377}</status>
</if>
<status status="SKIP" start="2026-04-19T18:04:24.160619" elapsed="0.317690">Token已失效且refreshToken不可用: Token刷新失败: {"code":910,"msg":"废弃的token","msgInfo":{"template":"废弃的token"},"ts":1776593064377}</status>
</branch>
<status status="SKIP" start="2026-04-19T18:04:24.160582" elapsed="0.317764">Token已失效且refreshToken不可用: Token刷新失败: {"code":910,"msg":"废弃的token","msgInfo":{"template":"废弃的token"},"ts":1776593064377}</status>
</if>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-04-19T18:04:24.478597" elapsed="0.000036"/>
</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-04-19T18:04:24.478787" elapsed="0.000023"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${resp_json}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:24.478940" elapsed="0.000021"/>
</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-04-19T18:04:24.479085" elapsed="0.000020"/>
</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-04-19T18:04:24.479367" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:24.479257" elapsed="0.000169"/>
</branch>
<status status="NOT RUN" start="2026-04-19T18:04:24.479235" elapsed="0.000218"/>
</if>
<kw name="验证响应字段值" owner="common">
<arg>${response}</arg>
<arg>code</arg>
<arg>${0}</arg>
<doc>验证响应JSON字段的值</doc>
<status status="NOT RUN" start="2026-04-19T18:04:24.479601" elapsed="0.000029"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-04-19T18:04:24.479793" elapsed="0.000027"/>
</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-04-19T18:04:24.479942" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${data}</arg>
<arg>uid</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:24.480091" elapsed="0.000021"/>
</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-04-19T18:04:24.480230" elapsed="0.000019"/>
</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-04-19T18:04:24.480373" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>用户 ${user_id} 的总收益为: ${data['totalEarnings']}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:24.480521" elapsed="0.000020"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-04-19T18:04:24.480707" 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-04-19T18:04:24.480934" elapsed="0.000026"/>
</kw>
<doc>验证获取用户收益信息接口功能</doc>
<tag>invite</tag>
<tag>profit</tag>
<status status="SKIP" start="2026-04-19T18:04:23.490513" elapsed="0.990694">Token已失效且refreshToken不可用: Token刷新失败: {"code":910,"msg":"废弃的token","msgInfo":{"template":"废弃的token"},"ts":1776593064377}</status>
</test>
<doc>用户及团队收益分析-获取用户收益信息</doc>
<status status="SKIP" start="2026-04-19T18:04:23.483423" elapsed="0.998270"/>
</suite>
<status status="SKIP" start="2026-04-19T18:04:23.482655" elapsed="1.000723"/>
</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-04-19T18:04:24.491626" 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-04-19T18:04:24.491273" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.492410" 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-04-19T18:04:24.492175" elapsed="0.000300"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:24.491845" elapsed="0.000673"/>
</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-04-19T18:04:24.492674" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:24.492550" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:24.491810" elapsed="0.000944"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.493594" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:24.493444" elapsed="0.000202"/>
</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-04-19T18:04:24.493926" 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-04-19T18:04:24.494071" 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-04-19T18:04:24.494205" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:24.494327" 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-04-19T18:04:24.494458" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:24.493722" elapsed="0.000787"/>
</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-04-19T18:04:24.494711" 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-04-19T18:04:24.494843" 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-04-19T18:04:24.494975" 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-04-19T18:04:24.495097" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:24.495215" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:24.495396" 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-04-19T18:04:24.495540" 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-04-19T18:04:24.495668" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:24.495792" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:24.494536" elapsed="0.001309"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.496257" 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-04-19T18:04:24.495980" elapsed="0.000325"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.496669" 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-04-19T18:04:24.496427" elapsed="0.000288"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.497067" 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-04-19T18:04:24.496832" elapsed="0.000281"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.497470" 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-04-19T18:04:24.497236" elapsed="0.000277"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.497857" 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-04-19T18:04:24.497630" elapsed="0.000271"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.498251" 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-04-19T18:04:24.498017" elapsed="0.000276"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.498656" 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-04-19T18:04:24.498410" elapsed="0.000289"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.499054" 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-04-19T18:04:24.498815" elapsed="0.000280"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.499454" 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-04-19T18:04:24.499211" elapsed="0.000281"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:24.495873" elapsed="0.003651"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:24.493702" elapsed="0.005842"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.499782" 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-04-19T18:04:24.499634" elapsed="0.000188"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:24.500207" 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-04-19T18:04:24.499920" elapsed="0.000479"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:24.493116" elapsed="0.007348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.500648" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:24.500564" elapsed="0.000124"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:24.491008" elapsed="0.009729"/>
</kw>
<test id="s1-s4-s1-s1-t1" name="获取余额货币列表" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.502089" 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-04-19T18:04:24.501888" elapsed="0.000227"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:24.503660" 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-04-19T18:04:24.503083" elapsed="0.000602"/>
</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-04-19T18:04:24.504218" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:24.503788" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:24.503771" elapsed="0.000541"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:24.504343" elapsed="0.000031"/>
</return>
<msg time="2026-04-19T18:04:24.504519" 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-04-19T18:04:24.502321" elapsed="0.002220"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:25.306116" 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-04-19T18:04:25.306505" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/spot/balance/public/currencies?version=4a2bb64c7fc890df605105b750aac8b3 
 status=200, reason=OK 
 headers={'Date': 'Sun, 19 Apr 2026 10:04:25 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': '141.11.146.71', 'X-Trace-ID': '9c7a8c7aad75f1c5b64bd6729daae0d1', 'X-Transparent': '00-9c7a8c7aad75f1c5b64bd6729daae0d1-46db7f7660b937c3-01', 'X-Upstream-Addr': '10.9.166.220:8080', 'X-Upstream-Header-Time': '0.007', 'X-Upstream-Service': 'default-spot-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': '9eeb15c19df506a7-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"time":1776587785841,"version":"1b0c83367aaa7bb584cd46fb04cfcac6","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":1,"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":1,"withdrawStatus":1,"convertEnabled":1,"transferEnabled":1,"isChainExist":1,"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":2755,"currency":"bxc","displayName":"BXC","fullName":"Bitcoin Classic (ARAW)","logo":"","cmcLink":null,"weight":253,"maxPrecision":8,"depositStatus":0,"withdrawStatus":0,"convertEnabled":0,"transferEnabled":0,"isChainExist":0,"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":131,"currency":"doge","displayName":"DOGE","fullName":"Dogecoin","logo":"https://s2.coinmarketcap.com/static/img/coins/64x64/74.png","cmcLink":"https://coinmarketcap.com/currencies/dogecoin/","weight":1,"maxPrecision":18,"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":1,"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":1776593065263} 
 </msg>
<msg time="2026-04-19T18:04:25.306928" 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-04-19T18:04:25.307286" 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-04-19T18:04:24.504633" elapsed="0.802705"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.309124" 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-04-19T18:04:25.307858" elapsed="0.001392"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.310846" level="INFO">${resp_json} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'time': 1776587785841, 'version': '1b0c83367aaa7bb584cd46fb04cfcac6', '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-04-19T18:04:25.309511" elapsed="0.001378"/>
</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-04-19T18:04:25.311077" elapsed="0.000232"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.313017" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "time": 1776587785841,
    "version": "1b0c83367aaa7bb584cd46fb04cfcac6",
    "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-04-19T18:04:25.311466" elapsed="0.001598"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.313565" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "time": 1776587785841,
    "version": "1b0c83367aaa7bb584cd46fb04cfcac6",
    "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": 1,
        "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": 1,
        "withdrawStatus": 1,
        "convertEnabled": 1,
        "transferEnabled": 1,
        "isChainExist": 1,
        "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": 2755,
        "currency": "bxc",
        "displayName": "BXC",
        "fullName": "Bitcoin Classic (ARAW)",
        "logo": "",
        "cmcLink": null,
        "weight": 253,
        "maxPrecision": 8,
        "depositStatus": 0,
        "withdrawStatus": 0,
        "convertEnabled": 0,
        "transferEnabled": 0,
        "isChainExist": 0,
        "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": 131,
        "currency": "doge",
        "displayName": "DOGE",
        "fullName": "Dogecoin",
        "logo": "https://s2.coinmarketcap.com/static/img/coins/64x64/74.png",
        "cmcLink": "https://coinmarketcap.com/currencies/dogecoin/",
        "weight": 1,
        "maxPrecision": 18,
        "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": 1,
        "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": 1776593065263
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:25.313261" elapsed="0.000654"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:25.315019" level="INFO">${data} = {'time': 1776587785841, 'version': '1b0c83367aaa7bb584cd46fb04cfcac6', '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-04-19T18:04:25.314065" elapsed="0.000985"/>
</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-04-19T18:04:25.315190" elapsed="0.000304"/>
</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-04-19T18:04:25.315657" elapsed="0.000203"/>
</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-04-19T18:04:25.317226" elapsed="0.000322"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-04-19T18:04:25.317990" 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-04-19T18:04:25.317732" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.318336" 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-04-19T18:04:25.318176" elapsed="0.000213"/>
</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-04-19T18:04:25.318706" elapsed="0.000185"/>
</kw>
<msg time="2026-04-19T18:04:25.318991" 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-04-19T18:04:25.318531" elapsed="0.000490"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:25.319615" 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-04-19T18:04:25.319313" elapsed="0.000432">Dictionary does not contain key 'symbols'.</status>
</kw>
<msg time="2026-04-19T18:04:25.319863" 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-04-19T18:04:25.319162" elapsed="0.000729"/>
</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-04-19T18:04:25.320202" elapsed="0.000168"/>
</kw>
<msg time="2026-04-19T18:04:25.320468" 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-04-19T18:04:25.320036" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:25.320981" 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-04-19T18:04:25.320790" elapsed="0.000262">Dictionary does not contain key 'timestamp'.</status>
</kw>
<msg time="2026-04-19T18:04:25.321157" 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-04-19T18:04:25.320636" elapsed="0.000548"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:25.321938" 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-04-19T18:04:25.321747" elapsed="0.000256">Dictionary does not contain key 'count'.</status>
</kw>
<msg time="2026-04-19T18:04:25.322101" 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-04-19T18:04:25.321321" elapsed="0.000804"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.322386" 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-04-19T18:04:25.322245" elapsed="0.000189"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.322660" 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-04-19T18:04:25.322538" elapsed="0.000164"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.322935" 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-04-19T18:04:25.322814" elapsed="0.000163"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.323198" 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-04-19T18:04:25.323079" elapsed="0.000162"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.323460" 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-04-19T18:04:25.323345" elapsed="0.000155"/>
</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-04-19T18:04:25.324598" elapsed="0.000250"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.325169" level="INFO">Length is 31.</msg>
<msg time="2026-04-19T18:04:25.325252" level="INFO">${list_length} = 31</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-04-19T18:04:25.325038" elapsed="0.000240"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.325520" level="INFO">货币列表包含 31 种货币</msg>
<arg>货币列表包含 ${list_length} 种货币</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:25.325392" elapsed="0.000169"/>
</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-04-19T18:04:25.326762" elapsed="0.000188"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.327164" 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-04-19T18:04:25.327047" elapsed="0.000160"/>
</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-04-19T18:04:25.327419" elapsed="0.000129"/>
</kw>
<msg time="2026-04-19T18:04:25.327623" 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-04-19T18:04:25.327305" elapsed="0.000339"/>
</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-04-19T18:04:25.327859" elapsed="0.000119"/>
</kw>
<msg time="2026-04-19T18:04:25.328051" 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-04-19T18:04:25.327746" elapsed="0.000325"/>
</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-04-19T18:04:25.328294" elapsed="0.000133"/>
</kw>
<msg time="2026-04-19T18:04:25.328502" 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-04-19T18:04:25.328176" elapsed="0.000346"/>
</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-04-19T18:04:25.328740" elapsed="0.000116"/>
</kw>
<msg time="2026-04-19T18:04:25.328925" 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-04-19T18:04:25.328627" elapsed="0.000319"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.329176" 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-04-19T18:04:25.329047" elapsed="0.000150"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:25.329578" 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-04-19T18:04:25.329417" elapsed="0.000224">Dictionary does not contain key 'contractAddress'.</status>
</kw>
<msg time="2026-04-19T18:04:25.329722" 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-04-19T18:04:25.329303" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:25.330226" 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-04-19T18:04:25.330096" elapsed="0.000174">Dictionary does not contain key 'withdrawFee'.</status>
</kw>
<msg time="2026-04-19T18:04:25.330342" 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-04-19T18:04:25.329854" elapsed="0.000506"/>
</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-04-19T18:04:25.330555" elapsed="0.000106"/>
</kw>
<msg time="2026-04-19T18:04:25.330724" 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-04-19T18:04:25.330454" elapsed="0.000289"/>
</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-04-19T18:04:25.330947" elapsed="0.000104"/>
</kw>
<msg time="2026-04-19T18:04:25.331118" 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-04-19T18:04:25.330835" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:25.331496" 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-04-19T18:04:25.331366" elapsed="0.000172">Dictionary does not contain key 'networkList'.</status>
</kw>
<msg time="2026-04-19T18:04:25.331607" 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-04-19T18:04:25.331231" elapsed="0.000394"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:25.331941" 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-04-19T18:04:25.331819" elapsed="0.000163">Dictionary does not contain key 'isMarginTradingAllowed'.</status>
</kw>
<msg time="2026-04-19T18:04:25.332052" 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-04-19T18:04:25.331715" elapsed="0.000355"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:25.332409" 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-04-19T18:04:25.332277" elapsed="0.000172">Dictionary does not contain key 'isDebitEnabled'.</status>
</kw>
<msg time="2026-04-19T18:04:25.332520" 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-04-19T18:04:25.332172" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:25.332870" 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-04-19T18:04:25.332749" elapsed="0.000164">Dictionary does not contain key 'debitEnabled'.</status>
</kw>
<msg time="2026-04-19T18:04:25.332980" 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-04-19T18:04:25.332637" elapsed="0.000362"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:25.333319" 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-04-19T18:04:25.333194" elapsed="0.000166">Dictionary does not contain key 'ipoPurchasingAllowed'.</status>
</kw>
<msg time="2026-04-19T18:04:25.333431" 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-04-19T18:04:25.333090" elapsed="0.000360"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:25.333772" 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-04-19T18:04:25.333652" elapsed="0.000161">Dictionary does not contain key 'ipoSellingAllowed'.</status>
</kw>
<msg time="2026-04-19T18:04:25.334023" 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-04-19T18:04:25.333549" elapsed="0.000553"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:25.335015" 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-04-19T18:04:25.334558" elapsed="0.000545">Dictionary does not contain key 'isLegalMoney'.</status>
</kw>
<msg time="2026-04-19T18:04:25.335223" 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-04-19T18:04:25.334332" elapsed="0.000923"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:25.335753" 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-04-19T18:04:25.335557" elapsed="0.000262">Dictionary does not contain key 'trading'.</status>
</kw>
<msg time="2026-04-19T18:04:25.335922" 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-04-19T18:04:25.335392" elapsed="0.000556"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.336262" 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-04-19T18:04:25.336096" elapsed="0.000218"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.336568" 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-04-19T18:04:25.336429" elapsed="0.000185"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.336859" 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-04-19T18:04:25.336727" elapsed="0.000175"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.337155" 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-04-19T18:04:25.337017" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.337561" 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-04-19T18:04:25.337403" elapsed="0.000205"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.337864" 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-04-19T18:04:25.337722" elapsed="0.000188"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.338120" 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-04-19T18:04:25.338003" elapsed="0.000157"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.338373" 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-04-19T18:04:25.338258" elapsed="0.000155"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.338624" 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-04-19T18:04:25.338508" elapsed="0.000152"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.338860" 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-04-19T18:04:25.338749" elapsed="0.000152"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.339113" 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-04-19T18:04:25.338994" elapsed="0.000158"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.339355" 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-04-19T18:04:25.339244" elapsed="0.000150"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.339618" 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-04-19T18:04:25.339499" elapsed="0.000157"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.339874" 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-04-19T18:04:25.339756" elapsed="0.000157"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.340118" 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-04-19T18:04:25.340006" elapsed="0.000154"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.340370" 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-04-19T18:04:25.340256" elapsed="0.000150"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.340612" 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-04-19T18:04:25.340496" elapsed="0.000153"/>
</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-04-19T18:04:25.341744" elapsed="0.000259"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.342253" 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-04-19T18:04:25.342115" elapsed="0.000178"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.342508" level="INFO">货币符号: btc</msg>
<arg>货币符号: ${symbol}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:25.342394" elapsed="0.000152"/>
</kw>
<arg>${currency_item['currency']}</arg>
<doc>验证货币符号格式</doc>
<status status="PASS" start="2026-04-19T18:04:25.340991" elapsed="0.001608"/>
</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-04-19T18:04:25.340760" elapsed="0.001883"/>
</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-04-19T18:04:25.343586" elapsed="0.000210"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.344030" 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-04-19T18:04:25.343897" elapsed="0.000173"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.344273" level="INFO">货币名称: BTC</msg>
<arg>货币名称: ${name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:25.344164" elapsed="0.000147"/>
</kw>
<arg>${currency_item['displayName']}</arg>
<doc>验证货币名称格式</doc>
<status status="PASS" start="2026-04-19T18:04:25.342945" elapsed="0.001416"/>
</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-04-19T18:04:25.342751" elapsed="0.001653"/>
</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-04-19T18:04:25.345313" elapsed="0.000368"/>
</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-04-19T18:04:25.345788" elapsed="0.000204"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.346214" level="INFO">货币精度: 8</msg>
<arg>货币精度: ${precision}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:25.346083" elapsed="0.000165"/>
</kw>
<arg>${currency_item['maxPrecision']}</arg>
<doc>验证货币精度格式</doc>
<status status="PASS" start="2026-04-19T18:04:25.344696" elapsed="0.001596"/>
</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-04-19T18:04:25.344506" elapsed="0.001821"/>
</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-04-19T18:04:25.347134" elapsed="0.000205"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.347528" level="INFO">充值状态: 1</msg>
<arg>充值状态: ${deposit_status}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:25.347427" elapsed="0.000135"/>
</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-04-19T18:04:25.347650" elapsed="0.000132"/>
</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-04-19T18:04:25.348047" elapsed="0.000166"/>
</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-04-19T18:04:25.347877" elapsed="0.000377"/>
</kw>
<arg>${currency_item['depositStatus']}</arg>
<doc>验证充值状态值</doc>
<status status="PASS" start="2026-04-19T18:04:25.346596" elapsed="0.001704"/>
</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-04-19T18:04:25.346423" elapsed="0.001910"/>
</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-04-19T18:04:25.349119" elapsed="0.000186"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.349491" level="INFO">提现状态: 1</msg>
<arg>提现状态: ${withdraw_status}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:25.349391" elapsed="0.000133"/>
</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-04-19T18:04:25.349609" elapsed="0.000127"/>
</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-04-19T18:04:25.350004" elapsed="0.000161"/>
</kw>
<arg>isinstance($withdraw_status, int)</arg>
<arg>Should Be True</arg>
<arg>$withdraw_status in [0, 1]</arg>
<arg>提现状态整数值应为0或1</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:25.349831" elapsed="0.000374"/>
</kw>
<arg>${currency_item['withdrawStatus']}</arg>
<doc>验证提现状态值</doc>
<status status="PASS" start="2026-04-19T18:04:25.348596" elapsed="0.001655"/>
</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-04-19T18:04:25.348425" elapsed="0.001859"/>
</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-04-19T18:04:25.350378" elapsed="0.000090"/>
</kw>
<arg>${currency_list[0]}</arg>
<doc>验证单个货币的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:25.326136" elapsed="0.024380"/>
</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-04-19T18:04:25.325676" elapsed="0.024878"/>
</kw>
<arg>${currency_dict['currencies']}</arg>
<doc>验证货币列表的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:25.323883" elapsed="0.026718"/>
</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-04-19T18:04:25.323620" elapsed="0.027016"/>
</kw>
<arg>${data}</arg>
<doc>验证货币字典的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:25.316650" elapsed="0.034033"/>
</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-04-19T18:04:25.315991" elapsed="0.034728"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.351192" 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-04-19T18:04:25.350810" elapsed="0.000420"/>
</kw>
<doc>验证余额货币列表接口功能</doc>
<tag>spot</tag>
<status status="PASS" start="2026-04-19T18:04:24.500799" elapsed="0.850551"/>
</test>
<doc>余额货币列表接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:24.487227" elapsed="0.864405"/>
</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-04-19T18:04:25.355752" 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-04-19T18:04:25.355598" elapsed="0.000176"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.356079" 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-04-19T18:04:25.355986" elapsed="0.000125"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:25.355847" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:25.356250" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:25.356179" elapsed="0.000107"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:25.355824" elapsed="0.000478"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.356784" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:25.356697" elapsed="0.000117"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:25.356973" 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-04-19T18:04:25.357067" 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-04-19T18:04:25.357152" 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-04-19T18:04:25.357238" 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-04-19T18:04:25.357320" elapsed="0.000011"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:25.356860" elapsed="0.000495"/>
</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-04-19T18:04:25.357482" 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-04-19T18:04:25.357565" 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-04-19T18:04:25.357645" elapsed="0.001228"/>
</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-04-19T18:04:25.358962" 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-04-19T18:04:25.359047" 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-04-19T18:04:25.359125" 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-04-19T18:04:25.359202" 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-04-19T18:04:25.359279" 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-04-19T18:04:25.359354" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:25.357374" elapsed="0.002016"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.359657" 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-04-19T18:04:25.359474" elapsed="0.000213"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.359910" 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-04-19T18:04:25.359763" elapsed="0.000177"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.360160" 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-04-19T18:04:25.360014" elapsed="0.000173"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.360404" 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-04-19T18:04:25.360260" elapsed="0.000171"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.360653" 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-04-19T18:04:25.360507" elapsed="0.000173"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.360900" 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-04-19T18:04:25.360753" elapsed="0.000174"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.361164" 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-04-19T18:04:25.361001" elapsed="0.000190"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.361420" 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-04-19T18:04:25.361264" elapsed="0.000183"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.361672" 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-04-19T18:04:25.361520" elapsed="0.000175"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:25.359410" elapsed="0.002307"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:25.356848" elapsed="0.004900"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.361922" 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-04-19T18:04:25.361817" elapsed="0.000132"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:25.362193" 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-04-19T18:04:25.362013" elapsed="0.000290"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:25.356516" elapsed="0.005830"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.362465" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:25.362410" elapsed="0.000081"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:25.355428" elapsed="0.007095"/>
</kw>
<test id="s1-s4-s1-s2-t1" name="获取货币价格转换" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.363365" 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-04-19T18:04:25.363242" elapsed="0.000141"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:25.364417" 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-04-19T18:04:25.363997" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:25.364861" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:25.364528" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:25.364510" elapsed="0.000403"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:25.364934" elapsed="0.000021"/>
</return>
<msg time="2026-04-19T18:04:25.365062" 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-04-19T18:04:25.363507" elapsed="0.001571"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:26.357311" 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-04-19T18:04:26.357798" 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': 'Sun, 19 Apr 2026 10:04:26 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': '141.11.146.71', 'X-Trace-ID': 'f087b581857a93311659c40f26de043f', 'X-Transparent': '00-f087b581857a93311659c40f26de043f-2344606782e1b1b4-01', 'X-Upstream-Addr': '10.9.166.220:8080', 'X-Upstream-Header-Time': '0.007', 'X-Upstream-Service': 'default-spot-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': '9eeb15c75e345333-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"uft":{"btc":"0.00000012769011875037571741401972","usd":"0.00890268634536612168","usdt":"0.0089"},"ksm":{"btc":"0.00007044477337801626657335244955","usd":"4.911482017499736792","usdt":"4.91"},"vanry":{"btc":"0.00000007690101533730492644260064","usd":"0.005361617843950832832","usdt":"0.00536"},"pyth":{"btc":"0.00000063414643244568614715726645","usd":"0.04421334117586321104","usdt":"0.0442"},"bal":{"btc":"0.00001387374661029363131902888365","usd":"0.9672918759515774904","usdt":"0.967"},"fio":{"btc":"0.00000003027260118688682738691928","usd":"0.002110636875137361432","usdt":"0.00211"},"mbox":{"btc":"0.00000018077477486008247633894926","usd":"0.01260380314063068912","usdt":"0.0126"},"theta":{"btc":"0.00000305595452739663233811080891","usd":"0.2130642911868521256","usdt":"0.213"},"vib":{"btc":"0.00000003199426570936380335205213","usd":"0.002230673095524320376","usdt":"0.00223"},"fis":{"btc":"0.00000027403160316091867445031197","usd":"0.01910576507825763192","usdt":"0.0191"},"vic":{"btc":"0.00000077905319642083162422261467","usd":"0.05431638972509892216","usdt":"0.0543"},"bar":{"btc":"0.00000671449163766020626401811535","usd":"0.4681412595091398816","usdt":"0.468"},"stpt":{"btc":"0.00000101033013060690539553879419","usd":"0.070441255330413740304","usdt":"0.07042"},"rad":{"btc":"0.00000394548119734306992009611479","usd":"0.27508300505344758","usdt":"0.275"},"bat":{"btc":"0.00000142180795147890265120554537","usd":"0.09912991200289692792","usdt":"0.0991"},"cake":{"btc":"0.00002192252825287349395602495782","usd":"1.5284612062606105536","usdt":"1.528"},"ssv":{"btc":"0.00003539455314125583088318950978","usd":"2.4677446307885642904","usdt":"2.467"},"ape":{"btc":"0.00000144332875800986485076970599","usd":"0.10063036475773391472","usdt":"0.1006"},"qi":{"btc":"0.00000002123386244388270356997182","usd":"0.001480446718105826976","usdt":"0.00148"},"farm":{"btc":"0.00016413201780947170867599837532","usd":"11.443453010223419328","usdt":"11.44"},"ctk":{"btc":"0.00000251793436412257734900679326","usd":"0.1755529723159274556","usdt":"0.1755"},"band":{"btc":"0.00000305595452739663233811080891","usd":"0.2130642911868521256","usdt":"0.213"},"iotx":{"btc":"0.00000006556672389766483467214271","usd":"0.004571379393070019784","usdt":"0.00457"},"near":{"btc":"0.00007562411414980116926846044022","usd":"5.2725909804971716152","usdt":"5.271"},"shib":{"btc":"0.00000000012209470905232554552733","usd":"0.000008512568629108505112","usdt":"0.00000851"},"xmr":{"btc":"0.00170301315681680872551057754815","usd":"118.73582799943355544","usdt":"118.7"},"dock":{"btc":"0.00000005595409698050171886681763","usd":"0.00390117716257616568","usdt":"0.0039"},"astr":{"btc":"0.00000011331421998769296810516042","usd":"0.0079003839051350144976","usdt":"0.007898"},"waves":{"btc":"0.00001543759188487688448735788915","usd":"1.0763247761363985312","usdt":"1.076"},"reef":{"btc":"0.00000000987087659553466220009501","usd":"0.0006882076635518979456","usdt":"0.000688"},"iris":{"btc":"0.00000007474893468420870648618457","usd":"0.005211572568467134152","usdt":"0.00521"},"apt":{"btc":"0.0000133429000491965637297795882","usd":"0.930280707998931816","usdt":"0.93"},"stg":{"btc":"0.00000297274074214357849979605449","usd":"0.20726254053481577664","usdt":"0.2072"},"ai":{"btc":"0.00000030846489361045819375296897","usd":"0.0215064894859968108","usdt":"0.0215"},"combo":{"btc":"0.00000039598284016970447198055552","usd":"0.02760833068900055712","usdt":"0.0276"},"dent":{"btc":"0.00000000124820677879580757472132","usd":"0.0000870262597805452344","usdt":"0.000087"},"kda":{"btc":"0.0000000860832261238487982566425","usd":"0.0060018110193479472","usdt":"0.006"},"metis":{"btc":"0.00005251076793554776693655192777","usd":"3.661104721802247792","usdt":"3.66"},"glm":{"btc":"0.00000184935464122735168254686981","usd":"0.12893890673232506568","usdt":"0.1289"},"loka":{"btc":"0.00000177474917858668272405777964","usd":"0.12373733718222351144","usdt":"0.1237"},"ray":{"btc":"0.00000926829401266772061229850966","usd":"0.6461949864164623152","usdt":"0.646"},"wld":{"btc":"0.00000374748977725821768410583703","usd":"0.26127883970894730144","usdt":"0.2612"},"agld":{"btc":"0.00000380200915380332192300171062","usd":"0.265079986687867668","usdt":"0.265"},"iost":{"btc":"0.00000001573888317631035528125614","usd":"0.0010973311147041163464","usdt":"0.001097"},"zro":{"btc":"0.0000227259716966960827397536212","usd":"1.5844781091078580608","usdt":"1.584"},"wing":{"btc":"0.00000467718861939578470527757608","usd":"0.3260983987179051312","usdt":"0.326"},"dgb":{"btc":"0.00000006284075507040962272734903","usd":"0.004381322044124001456","usdt":"0.00438"},"bb":{"btc":"0.00000036728843146175487256167469","usd":"0.02560772701588457472","usdt":"0.0256"},"zrx":{"btc":"0.00000151649950021513632928785212","usd":"0.10573190412417966984","usdt":"0.1057"},"sui":{"btc":"0.00001350932761970267140640909705","usd":"0.94188420930300451392","usdt":"0.9416"},"bsw":{"btc":"0.00000016068868876451775674573268","usd":"0.01120338056944950144","usdt":"0.0112"},"omg":{"btc":"0.00000549497926757234828871567987","usd":"0.3831156034017106296","usdt":"0.383"},"blur":{"btc":"0.00000043328557149003895122510061","usd":"0.03020911546405133424","usdt":"0.0302"},"jst":{"btc":"0.00000103041621670247011513201078","usd":"0.071841677901594927984","usdt":"0.07182"},"pol":{"btc":"0.00000127403174663296221419830907","usd":"0.08882680308634961856","usdt":"0.0888"},"pivx":{"btc":"0.00000113916802570559909692956914","usd":"0.07942396582270450128","usdt":"0.0794"},"gmt":{"btc":"0.00000015925396832912027677478863","usd":"0.01110335038579370232","usdt":"0.0111"},"nkn":{"btc":"0.00000010473459178401603787891505","usd":"0.00730220340687333576","usdt":"0.0073"},"porto":{"btc":"0.00001357245531886016052513063488","usd":"0.9462855373838596752","usdt":"0.946"},"rsr":{"btc":"0.00000002439024740175715950604871","usd":"0.00170051312214858504","usdt":"0.0017"},"sc":{"btc":"0.00000001400287144947940451641385","usd":"0.0009762945924805994112","usdt":"0.000976"},"twt":{"btc":"0.00000575896782768548460336938355","usd":"0.40152115719437766768","usdt":"0.4014"},"arb":{"btc":"0.00000179626998511764492362194026","usd":"0.12523778993706049824","usdt":"0.1252"},"btc":{"btc":"1","usd":"69721.028005073621060088","usdt":"69699.99"},"cvc":{"btc":"0.00000043558112418667491917861107","usd":"0.030369163757900612832","usdt":"0.03036"},"ardr":{"btc":"0.00000062596852596392051132288541","usd":"0.043643169129025156056","usdt":"0.04363"},"vite":{"btc":"0.00000001233859574441832775011876","usd":"0.000860259579439872432","usdt":"0.00086"},"gmx":{"btc":"0.00008995697129942199417819141724","usd":"6.271892515218604824","usdt":"6.27"},"sei":{"btc":"0.00000078923971151215373201631736","usd":"0.055026604029055095912","usdt":"0.05501"},"matic":{"btc":"0.00000544332933189803900976169437","usd":"0.37951451679010186128","usdt":"0.3794"},"audio":{"btc":"0.00000028106173329436632630793778","usd":"0.019595912978171047608","usdt":"0.01959"},"ark":{"btc":"0.00000243472057886952351069203884","usd":"0.16975122166389110664","usdt":"0.1697"},"cvp":{"btc":"0.00000048637022759974571015003015","usd":"0.03391023225931590168","usdt":"0.0339"},"key":{"btc":"0.00000001797704705553042403592884","usd":"0.0012533782012071629736","usdt":"0.001253"},"btt":{"btc":"0","usd":"0","usdt":"0"},"cvx":{"btc":"0.00002546628772830526948425674093","usd":"1.77553575989043438","usdt":"1.775"},"flm":{"btc":"0.00000023959831271137915514765497","usd":"0.01670504067051845304","usdt":"0.0167"},"one":{"btc":"0.00000003170732162228430735786332","usd":"0.002210667058793160552","usdt":"0.00221"},"btx":{"btc":"0.00000258106206328006646772833109","usd":"0.17995430039678261688","usdt":"0.1799"},"ong":{"btc":"0.00000115035884510169944070293267","usd":"0.080204201255219734416","usdt":"0.08018"},"gno":{"btc":"0.00172797729239272487700500387446","usd":"120.476353195044460128","usdt":"120.44"},"storj":{"btc":"0.00000145337180105764721056631428","usd":"0.10133057604332450856","usdt":"0.1013"},"gns":{"btc":"0.00000985652939118068740038556677","usd":"0.6872073617153399544","usdt":"0.687"},"people":{"btc":"0.00000010674320039357250983823671","usd":"0.007442245663991454528","usdt":"0.00744"},"tnsr":{"btc":"0.0000005466284858864398689296799","usd":"0.03811149997285946472","usdt":"0.0381"},"bttc":{"btc":"0.00000000000459110539327193590702","usd":"0.000000320096587698557184","usdt":"0.00000032"},"vtho":{"btc":"0.00000000817790648176563583438104","usd":"0.000570172046838054984","usdt":"0.00057"},"polyx":{"btc":"0.00000071879493813413746544296491","usd":"0.05011512201155535912","usdt":"0.0501"},"t":{"btc":"0.0000000893830831252630021898138","usd":"0.006231880441756285176","usdt":"0.00623"},"ont":{"btc":"0.00000108407476098633586604531794","usd":"0.075582806770321815072","usdt":"0.07556"},"mana":{"btc":"0.00000131133447795329669344285415","usd":"0.09142758786140039568","usdt":"0.0914"},"cfx":{"btc":"0.00000084691547301513242684826784","usd":"0.059047817412018220536","usdt":"0.05903"},"w":{"btc":"0.00000017934005442468499636800522","usd":"0.01250377295697489","usdt":"0.0125"},"dodo":{"btc":"0.00000024992829984624101093845207","usd":"0.017425257992840206704","usdt":"0.01742"},"ankr":{"btc":"0.0000000720229658569534945413909","usd":"0.005021515219521115824","usdt":"0.00502"},"mina":{"btc":"0.00000082783369122434594323471209","usd":"0.05771741596939609224","usdt":"0.0577"},"sfp":{"btc":"0.00000430703074706323487277401331","usd":"0.30029061133470895824","usdt":"0.3002"},"dia":{"btc":"0.0000028321381394746254626435384","usd":"0.19745958253654746288","usdt":"0.1974"},"aca":{"btc":"0.00000002582496783715463947699275","usd":"0.00180054330580438416","usdt":"0.0018"},"algo":{"btc":"0.00000149641341411957160969463554","usd":"0.10433148155299848216","usdt":"0.1043"},"asr":{"btc":"0.00001870875447758313882111030432","usd":"1.3043935948716205248","usdt":"1.304"},"df":{"btc":"0.00000002352941514051867152348228","usd":"0.001640495011955105568","usdt"... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-19T18:04:26.358363" 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-04-19T18:04:26.358782" 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-04-19T18:04:25.365144" elapsed="0.993715"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.360988" 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-04-19T18:04:26.359477" elapsed="0.001651"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.364379" level="INFO">${resp_json} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'uft': {'btc': '0.00000012769011875037571741401972', 'usd': '0.00890268634536612168', 'usdt': '0.0089'}, 'ksm': {'btc': '0.00007044477337801626657...</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-04-19T18:04:26.361416" elapsed="0.003027"/>
</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-04-19T18:04:26.364717" elapsed="0.032222"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.399228" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "uft": {
      "btc": "0.00000012769011875037571741401972",
      "usd": "0.00890268634536612168",
      "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-04-19T18:04:26.397137" elapsed="0.002124"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.399606" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "uft": {
      "btc": "0.00000012769011875037571741401972",
      "usd": "0.00890268634536612168",
      "usdt": "0.0089"
    },
    "ksm": {
      "btc": "0.00007044477337801626657335244955",
      "usd": "4.911482017499736792",
      "usdt": "4.91"
    },
    "vanry": {
      "btc": "0.00000007690101533730492644260064",
      "usd": "0.005361617843950832832",
      "usdt": "0.00536"
    },
    "pyth": {
      "btc": "0.00000063414643244568614715726645",
      "usd": "0.04421334117586321104",
      "usdt": "0.0442"
    },
    "bal": {
      "btc": "0.00001387374661029363131902888365",
      "usd": "0.9672918759515774904",
      "usdt": "0.967"
    },
    "fio": {
      "btc": "0.00000003027260118688682738691928",
      "usd": "0.002110636875137361432",
      "usdt": "0.00211"
    },
    "mbox": {
      "btc": "0.00000018077477486008247633894926",
      "usd": "0.01260380314063068912",
      "usdt": "0.0126"
    },
    "theta": {
      "btc": "0.00000305595452739663233811080891",
      "usd": "0.2130642911868521256",
      "usdt": "0.213"
    },
    "vib": {
      "btc": "0.00000003199426570936380335205213",
      "usd": "0.002230673095524320376",
      "usdt": "0.00223"
    },
    "fis": {
      "btc": "0.00000027403160316091867445031197",
      "usd": "0.01910576507825763192",
      "usdt": "0.0191"
    },
    "vic": {
      "btc": "0.00000077905319642083162422261467",
      "usd": "0.05431638972509892216",
      "usdt": "0.0543"
    },
    "bar": {
      "btc": "0.00000671449163766020626401811535",
      "usd": "0.4681412595091398816",
      "usdt": "0.468"
    },
    "stpt": {
      "btc": "0.00000101033013060690539553879419",
      "usd": "0.070441255330413740304",
      "usdt": "0.07042"
    },
    "rad": {
      "btc": "0.00000394548119734306992009611479",
      "usd": "0.27508300505344758",
      "usdt": "0.275"
    },
    "bat": {
      "btc": "0.00000142180795147890265120554537",
      "usd": "0.09912991200289692792",
      "usdt": "0.0991"
    },
    "cake": {
      "btc": "0.00002192252825287349395602495782",
      "usd": "1.5284612062606105536",
      "usdt": "1.528"
    },
    "ssv": {
      "btc": "0.00003539455314125583088318950978",
      "usd": "2.4677446307885642904",
      "usdt": "2.467"
    },
    "ape": {
      "btc": "0.00000144332875800986485076970599",
      "usd": "0.10063036475773391472",
      "usdt": "0.1006"
    },
    "qi": {
      "btc": "0.00000002123386244388270356997182",
      "usd": "0.001480446718105826976",
      "usdt": "0.00148"
    },
    "farm": {
      "btc": "0.00016413201780947170867599837532",
      "usd": "11.443453010223419328",
      "usdt": "11.44"
    },
    "ctk": {
      "btc": "0.00000251793436412257734900679326",
      "usd": "0.1755529723159274556",
      "usdt": "0.1755"
    },
    "band": {
      "btc": "0.00000305595452739663233811080891",
      "usd": "0.2130642911868521256",
      "usdt": "0.213"
    },
    "iotx": {
      "btc": "0.00000006556672389766483467214271",
      "usd": "0.004571379393070019784",
      "usdt": "0.00457"
    },
    "near": {
      "btc": "0.00007562411414980116926846044022",
      "usd": "5.2725909804971716152",
      "usdt": "5.271"
    },
    "shib": {
      "btc": "0.00000000012209470905232554552733",
      "usd": "0.000008512568629108505112",
      "usdt": "0.00000851"
    },
    "xmr": {
      "btc": "0.00170301315681680872551057754815",
      "usd": "118.73582799943355544",
      "usdt": "118.7"
    },
    "dock": {
      "btc": "0.00000005595409698050171886681763",
      "usd": "0.00390117716257616568",
      "usdt": "0.0039"
    },
    "astr": {
      "btc": "0.00000011331421998769296810516042",
      "usd": "0.0079003839051350144976",
      "usdt": "0.007898"
    },
    "waves": {
      "btc": "0.00001543759188487688448735788915",
      "usd": "1.0763247761363985312",
      "usdt": "1.076"
    },
    "reef": {
      "btc": "0.00000000987087659553466220009501",
      "usd": "0.0006882076635518979456",
      "usdt": "0.000688"
    },
    "iris": {
      "btc": "0.00000007474893468420870648618457",
      "usd": "0.005211572568467134152",
      "usdt": "0.00521"
    },
    "apt": {
      "btc": "0.0000133429000491965637297795882",
      "usd": "0.930280707998931816",
      "usdt": "0.93"
    },
    "stg": {
      "btc": "0.00000297274074214357849979605449",
      "usd": "0.20726254053481577664",
      "usdt": "0.2072"
    },
    "ai": {
      "btc": "0.00000030846489361045819375296897",
      "usd": "0.0215064894859968108",
      "usdt": "0.0215"
    },
    "combo": {
      "btc": "0.00000039598284016970447198055552",
      "usd": "0.02760833068900055712",
      "usdt": "0.0276"
    },
    "dent": {
      "btc": "0.00000000124820677879580757472132",
      "usd": "0.0000870262597805452344",
      "usdt": "0.000087"
    },
    "kda": {
      "btc": "0.0000000860832261238487982566425",
      "usd": "0.0060018110193479472",
      "usdt": "0.006"
    },
    "metis": {
      "btc": "0.00005251076793554776693655192777",
      "usd": "3.661104721802247792",
      "usdt": "3.66"
    },
    "glm": {
      "btc": "0.00000184935464122735168254686981",
      "usd": "0.12893890673232506568",
      "usdt": "0.1289"
    },
    "loka": {
      "btc": "0.00000177474917858668272405777964",
      "usd": "0.12373733718222351144",
      "usdt": "0.1237"
    },
    "ray": {
      "btc": "0.00000926829401266772061229850966",
      "usd": "0.6461949864164623152",
      "usdt": "0.646"
    },
    "wld": {
      "btc": "0.00000374748977725821768410583703",
      "usd": "0.26127883970894730144",
      "usdt": "0.2612"
    },
    "agld": {
      "btc": "0.00000380200915380332192300171062",
      "usd": "0.265079986687867668",
      "usdt": "0.265"
    },
    "iost": {
      "btc": "0.00000001573888317631035528125614",
      "usd": "0.0010973311147041163464",
      "usdt": "0.001097"
    },
    "zro": {
      "btc": "0.0000227259716966960827397536212",
      "usd": "1.5844781091078580608",
      "usdt": "1.584"
    },
    "wing": {
      "btc": "0.00000467718861939578470527757608",
      "usd": "0.3260983987179051312",
      "usdt": "0.326"
    },
    "dgb": {
      "btc": "0.00000006284075507040962272734903",
      "usd": "0.004381322044124001456",
      "usdt": "0.00438"
    },
    "bb": {
      "btc": "0.00000036728843146175487256167469",
      "usd": "0.02560772701588457472",
      "usdt": "0.0256"
    },
    "zrx": {
      "btc": "0.00000151649950021513632928785212",
      "usd": "0.10573190412417966984",
      "usdt": "0.1057"
    },
    "sui": {
      "btc": "0.00001350932761970267140640909705",
      "usd": "0.94188420930300451392",
      "usdt": "0.9416"
    },
    "bsw": {
      "btc": "0.00000016068868876451775674573268",
      "usd": "0.01120338056944950144",
      "usdt": "0.0112"
    },
    "omg": {
      "btc": "0.00000549497926757234828871567987",
      "usd": "0.3831156034017106296",
      "usdt": "0.383"
    },
    "blur": {
      "btc": "0.00000043328557149003895122510061",
      "usd": "0.03020911546405133424",
      "usdt": "0.0302"
    },
    "jst": {
      "btc": "0.00000103041621670247011513201078",
      "usd": "0.071841677901594927984",
      "usdt": "0.07182"
    },
    "pol": {
      "btc": "0.00000127403174663296221419830907",
      "usd": "0.08882680308634961856",
      "usdt": "0.0888"
    },
    "pivx": {
      "btc": "0.00000113916802570559909692956914",
      "usd": "0.07942396582270450128",
      "usdt": "0.0794"
    },
    "gmt": {
      "btc": "0.00000015925396832912027677478863",
      "usd": "0.01110335038579370232",
      "usdt": "0.0111"
    },
    "nkn": {
      "btc": "0.00000010473459178401603787891505",
      "usd": "0.00730220340687333576",
      "usdt": "0.0073"
    },
    "porto": {
      "btc": "0.00001357245531886016052513063488",
      "usd": "0.9462855373838596752",
      "usdt": "0.946"
    },
    "rsr": {
      "btc": "0.00000002439024740175715950604871",
      "usd": "0.00170051312214858504",
      "usdt": "0.0017"
    },
    "sc": {
      "btc": "0.00000001400287144947940451641385",
      "usd": "0.0009762945924805994112",
      "usdt": "0.000976"
    },
    "twt": {
      "btc": "0.00000575896782768548460336938355",
      "usd": "0.40152115719437766768",
      "usdt": "0.4014"
    },
    "arb": {
      "btc": "0.00000179626998511764492362194026",
      "usd": "0.12523778993706049824",
      "usdt": "0.1252"
    },
    "btc": {
      "btc": "1",
      "usd": "69721.028005073621060088",
      "usdt": "69699.99"
    },
    "cvc": {
      "btc": "0.00000043558112418667491917861107",
      "usd": "0.030369163757900612832",
      "usdt": "0.03036"
    },
    "ardr": {
      "btc": "0.00000062596852596392051132288541",
      "usd": "0.043643169129025156056",
      "usdt": "0.04363"
    },
    "vite": {
      "btc": "0.00000001233859574441832775011876",
      "usd": "0.000860259579439872432",
      "usdt": "0.00086"
    },
    "gmx": {
      "btc": "0.00008995697129942199417819141724",
      "usd": "6.271892515218604824",
      "usdt": "6.27"
    },
    "sei": {
      "btc": "0.00000078923971151215373201631736",
      "usd": "0.055026604029055095912",
      "usdt": "0.05501"
    },
    "matic": {
      "btc": "0.00000544332933189803900976169437",
      "usd": "0.37951451679010186128",
      "usdt": "0.3794"
    },
    "audio": {
      "btc": "0.00000028106173329436632630793778",
      "usd": "0.019595912978171047608",
      "usdt": "0.01959"
    },
    "ark": {
      "btc": "0.00000243472057886952351069203884",
      "usd": "0.16975122166389110664",
      "usdt": "0.1697"
    },
    "cvp": {
      "btc": "0.00000048637022759974571015003015",
      "usd": "0.03391023225931590168",
      "usdt": "0.0339"
    },
    "key": {
      "btc": "0.00000001797704705553042403592884",
      "usd": "0.0012533782012071629736",
      "usdt": "0.001253"
    },
    "btt": {
      "btc": "0",
      "usd": "0",
      "usdt": "0"
    },
    "cvx": {
      "btc": "0.00002546628772830526948425674093",
      "usd": "1.77553575989043438",
      "usdt": "1.775"
    },
    "flm": {
      "btc": "0.00000023959831271137915514765497",
      "usd": "0.01670504067051845304",
      "usdt": "0.0167"
    },
    "one": {
      "btc": "0.00000003170732162228430735786332",
      "usd": "0.002210667058793160552",
      "usdt": "0.00221"
    },
    "btx": {
      "btc": "0.00000258106206328006646772833109",
      "usd": "0.17995430039678261688",
      "usdt": "0.1799"
    },
    "ong": {
      "btc": "0.00000115035884510169944070293267",
      "usd": "0.080204201255219734416",
      "usdt": "0.08018"
    },
    "gno": {
      "btc": "0.00172797729239272487700500387446",
      "usd": "120.476353195044460128",
      "usdt": "120.44"
    },
    "storj": {
      "btc": "0.00000145337180105764721056631428",
      "usd": "0.10133057604332450856",
      "usdt": "0.1013"
    },
    "gns": {
      "btc": "0.00000985652939118068740038556677",
      "usd": "0.6872073617153399544",
      "usdt": "0.687"
    },
    "people": {
      "btc": "0.00000010674320039357250983823671",
      "usd": "0.007442245663991454528",
      "usdt": "0.00744"
    },
    "tnsr": {
      "btc": "0.0000005466284858864398689296799",
      "usd": "0.03811149997285946472",
      "usdt": "0.0381"
    },
    "bttc": {
      "btc": "0.00000000000459110539327193590702",
      "usd": "0.000000320096587698557184",
      "usdt": "0.00000032"
    },
    "vtho": {
      "btc": "0.00000000817790648176563583438104",
      "usd": "0.000570172046838054984",
      "usdt": "0.00057"
    },
    "polyx": {
      "btc": "0.00000071879493813413746544296491",
      "usd": "0.05011512201155535912",
      "usdt": "0.0501"
    },
    "t": {
      "btc": "0.0000000893830831252630021898138",
      "usd": "0.006231880441756285176",
      "usdt": "0.00623"
    },
    "ont": {
      "btc": "0.00000108407476098633586604531794",
      "usd": "0.075582806770321815072",
      "usdt": "0.07556"
    },
    "mana": {
      "btc": "0.00000131133447795329669344285415",
      "usd": "0.09142758786140039568",
      "usdt": "0.0914"
    },
    "cfx": {
      "btc": "0.00000084691547301513242684826784",
      "usd": "0.059047817412018220536",
      "usdt": "0.05903"
    },
    "w": {
      "btc": "0.00000017934005442468499636800522",
      "usd": "0.01250377295697489",
      "usdt": "0.0125"
    },
    "dodo": {
      "btc": "0.00000024992829984624101093845207",
      "usd": "0.017425257992840206704",
      "usdt": "0.01742"
    },
    "ankr": {
      "btc": "0.0000000720229658569534945413909",
      "usd": "0.005021515219521115824",
      "usdt": "0.00502"
    },
    "mina": {
      "btc": "0.00000082783369122434594323471209",
      "usd": "0.05771741596939609224",
      "usdt": "0.0577"
    },
    "sfp": {
      "btc": "0.00000430703074706323487277401331",
      "usd": "0.30029061133470895824",
      "usdt": "0.3002"
    },
    "dia": {
      "btc": "0.0000028321381394746254626435384",
      "usd": "0.19745958253654746288",
      "usdt": "0.1974"
    },
    "aca": {
      "btc": "0.00000002582496783715463947699275",
      "usd": "0.00180054330580438416",
      "usdt": "0.0018"
    },
    "algo": {
      "btc": "0.00000149641341411957160969463554",
      "usd": "0.10433148155299848216",
      "usdt": "0.1043"
    },
    "asr": {
      "btc": "0.00001870875447758313882111030432",
      "usd": "1.3043935948716205248",
      "usdt": "1.304"
    },
    "df": {
      "btc": "0.00000002352941514051867152348228",
      "usd": "0.001640495011955105568",
      "usdt": "0.00164"
    },
    "ast": {
      "btc": "0.00000037446203363874227241639489",
      "usd": "0.02610787793416357032",
      "usdt": "0.0261"
    },
    "jup": {
      "btc": "0.00000250502188020400002926829688",
      "usd": "0.17465270066302526352",
      "usdt": "0.1746"
    },
    "dusk": {
      "btc": "0.00000212195152395287287702623774",
      "usd": "0.14794464162692689848",
      "usdt": "0.1479"
    },
    "doge": {
      "btc": "0.00000140746074712492785149610494",
      "usd": "0.09812961016633893672",
      "usdt": "0.0981"
    },
    "bel": {
      "btc": "0.000001581061919808022927980334",
      "usd": "0.11023326238869063024",
      "usdt": "0.1102"
    },
    "acm": {
      "btc": "0.00000606886744173134027709329657",
      "usd": "0.4231276768640302776",
      "usdt": "0.423"
    },
    "juv": {
      "btc": "0.00000727403260746522345268629163",
      "usd": "0.5071530311349015384",
      "usdt": "0.507"
    },
    "bome": {
      "btc": "0.00000000769010153373049264426006",
      "usd": "0.0005361617843950832832",
      "usdt": "0.000536"
    },
    "tia": {
      "btc": "0.00000566284155851385344531613276",
      "usd": "0.39481913488943912664",
      "usdt": "0.3947"
    },
    "ata": {
      "btc": "0.00000015638452745832531683290055",
      "usd": "0.01090329001848210408",
      "usdt": "0.0109"
    },
    "nmr": {
      "btc": "0.00011994262839922932557092188966",
      "usd": "8.362523353624806432",
      "usdt": "8.36"
    },
    "loom": {
      "btc": "0.00000069311344234052257396306657",
      "usd": "0.048324581724116554872",
      "usdt": "0.04831"
    },
    "paxg": {
      "btc": "0.06852196105049656391629324480534",
      "usd": "4777.421565364234811376",
      "usdt": "4775.98"
    },
    "lit": {
      "btc": "0.00001065997283500327618411423015",
      "usd": "0.7432242645625874616",
      "usdt": "0.743"
    },
    "woo": {
      "btc": "0.00000304160732304265753840136849",
      "usd": "0.2120639893502941344",
      "usdt": "0.212"
    },
    "rei": {
      "btc": "0.00000005753228945943894683485607",
      "usd": "0.004011210364597544712",
      "usdt": "0.00401"
    },
    "rare": {
      "btc": "0.00000022381638792200687546727051",
      "usd": "0.01560470865030466272",
      "usdt": "0.0156"
    },
    "zec": {
      "btc": "0.00463802075150943350207080374043",
      "usd": "323.367574704101815224",
      "usdt": "323.27"
    },
    "ren": {
      "btc": "0.00000061319951408888293958148344",
      "usd": "0.042752900494488543888",
      "usdt": "0.04274"
    },
    "atm": {
      "btc": "0.00001583931360678817887922222084",
      "usd": "1.1043332275600222848",
      "usdt": "1.104"
    },
    "hbar": {
      "btc": "0.00000125767593366943094252954699",
      "usd": "0.087686458992673508592",
      "usdt": "0.08766"
    },
    "rep": {
      "btc": "0.00006786227659430080262565317441",
      "usd": "4.731427686919298376",
      "usdt": "4.73"
    },
    "elf": {
      "btc": "0.00000325968482922307449398486284",
      "usd": "0.22726857726597560064",
      "usdt": "0.2272"
    },
    "pepe": {
      "btc": "0.00000000005337160019678625491912",
      "usd": "0.000003721122831995727264",
      "usdt": "0.00000372"
    },
    "icx": {
      "btc": "0.00000054519376545104238895873586",
      "usd": "0.0380114697892036656",
      "usdt": "0.038"
    },
    "req": {
      "btc": "0.00000158393136067881788792222208",
      "usd": "0.11043332275600222848",
      "usdt": "0.1104"
    },
    "xai": {
      "btc": "0.00000015222383819567262491716283",
      "usd": "0.010613202485880286632",
      "usdt": "0.01061"
    },
    "strax": {
      "btc": "0.00000018995698564662634815299113",
      "usd": "0.013243996316027803488",
      "usdt": "0.01324"
    },
    "chess": {
      "btc": "0.00000004031564423466918718352757",
      "usd": "0.002810848160727955272",
      "usdt": "0.00281"
    },
    "tusd": {
      "btc": "0.00001433285714962082490973097701",
      "usd": "0.9993015347214332088",
      "usdt": "0.999"
    },
    "ctsi": {
      "btc": "0.00000048421814694664949019361409",
      "usd": "0.033760186983832203",
      "usdt": "0.03375"
    },
    "sxp": {
      "btc": "0.00000003156384957874455936076892",
      "usd": "0.00220066404042758064",
      "usdt": "0.0022"
    },
    "rvn": {
      "btc": "0.00000008393114547075257830022644",
      "usd": "0.00585176574386424852",
      "usdt": "0.00585"
    },
    "chr": {
      "btc": "0.00000026269731172127858267985404",
      "usd": "0.018315526627376818872",
      "usdt": "0.01831"
    },
    "fida": {
      "btc": "0.00000023185082236023276330455715",
      "usd": "0.016164877678777137792",
      "usdt": "0.01616"
    },
    "ntrn": {
      "btc": "0.00000002295552696635967953510467",
      "usd": "0.00160048293849278592",
      "usdt": "0.0016"
    },
    "sand": {
      "btc": "0.00000112912498265781673713296085",
      "usd": "0.07872375453711390744",
      "usdt": "0.0787"
    },
    "osmo": {
      "btc": "0.00000047058830281037343046964569",
      "usd": "0.03280990023910211136",
      "usdt": "0.0328"
    },
    "kava": {
      "btc": "0.000000797274145950379619853604",
      "usd": "0.055586773057527570984",
      "usdt": "0.05557"
    },
    "ocean": {
      "btc": "0.00000878479322593876986209036759",
      "usd": "0.61248481452445801176",
      "usdt": "0.6123"
    },
    "vidt": {
      "btc": "0.00000001649928500707101966585648",
      "usd": "0.00115034711204168988",
      "usdt": "0.00115"
    },
    "adx": {
      "btc": "0.00000114060274614099657690051319",
      "usd": "0.0795239960063603004",
      "usdt": "0.0795"
    },
    "chz": {
      "btc": "0.00000057704455911686644431369359",
      "usd": "0.040232139866362406064",
      "usdt": "0.04022"
    },
    "xrp": {
      "btc": "0.00003067001874749192933887078031",
      "usd": "2.13834523601001778824",
      "usdt": "2.1377"
    },
    "c98": {
      "btc": "0.00000030272601186886827386919281",
      "usd": "0.02110636875137361432",
      "usdt": "0.0211"
    },
    "psg": {
      "btc": "0.00001197991563556895775738274855",
      "usd": "0.835252033525922652",
      "usdt": "0.835"
    },
    "perp": {
      "btc": "0.00000179340054424684996368005218",
      "usd": "0.1250377295697489",
      "usdt": "0.125"
    },
    "for": {
      "btc": "0.00000004390244532316288711088768",
      "usd": "0.003060923619867453072",
      "usdt": "0.00306"
    },
    "uma": {
      "btc": "0.00000635581152881083627128210492",
      "usd": "0.4431337135951901016",
      "usdt": "0.443"
    },
    "syn": {
      "btc": "0.00000073744630379430470506523746",
      "usd": "0.05141551439908074768",
      "usdt": "0.0514"
    },
    "jasmy": {
      "btc": "0.00000007962698416456013838739432",
      "usd": "0.00555167519289685116",
      "usdt": "0.00555"
    },
    "sys": {
      "btc": "0.00000014964134141195716096946355",
      "usd": "0.010433148155299848216",
      "usdt": "0.01043"
    },
    "lunc": {
      "btc": "0.00000000061090396139224697162797",
      "usd": "0.000042592852200639265296",
      "usdt": "0.00004258"
    },
    "luna": {
      "btc": "0.00000081492120730576862349621571",
      "usd": "0.05681714431649390016",
      "usdt": "0.0568"
    },
    "auction": {
      "btc": "0.00006714491637660206264018115354",
      "usd": "4.681412595091398816",
      "usdt": "4.68"
    },
    "not": {
      "btc": "0.00000000549497926757234828871568",
      "usd": "0.0003831156034017106296",
      "usdt": "0.000383"
    },
    "gal": {
      "btc": "0.00003647059346780394086139754109",
      "usd": "2.5427672685304136304",
      "usdt": "2.542"
    },
    "yfii": {
      "btc": "0.00624820749615602527346130178785",
      "usd": "435.6314498210051676",
      "usdt": "435.5"
    },
    "alpha": {
      "btc": "0.00000013916788223355555718157205",
      "usd": "0.00970292781461251464",
      "usdt": "0.0097"
    },
    "tko": {
      "btc": "0.00000090243915386501490172380226",
      "usd": "0.06291898551949764648",
      "usdt": "0.0629"
    },
    "pixel": {
      "btc": "0.00000010918222513374822578884158",
      "usd": "0.007612296976206313032",
      "usdt": "0.00761"
    },
    "nexo": {
      "btc": "0.00001275466467068359694169253109",
      "usd": "0.8892683327000541768",
      "usdt": "0.889"
    },
    "bico": {
      "btc": "0.00000034433290449539519302657002",
      "usd": "0.0240072440773917888",
      "usdt": "0.024"
    },
    "troy": {
      "btc": "0.00000000098995710042426117995139",
      "usd": "0.0000690208267225013928",
      "usdt": "0.000069"
    },
    "mask": {
      "btc": "0.00000659971400282840786634259201",
      "usd": "0.460138844816675952",
      "usdt": "0.46"
    },
    "enj": {
      "btc": "0.00000097905322511524033217221408",
      "usd": "0.068260597326717319488",
      "usdt": "0.06824"
    },
    "aave": {
      "btc": "0.00133256834039717939701282597028",
      "usd": "92.908034579506222656",
      "usdt": "92.88"
    },
    "wan": {
      "btc": "0.00000080157830725657205976643612",
      "usd": "0.055886863608494968344",
      "usdt": "0.05587"
    },
    "gm": {
      "btc": "0.01025179487113269313238065026746",
      "usd": "714.76567731251261196",
      "usdt": "714.55"
    },
    "oax": {
      "btc": "0.00000051362991587229782959796694",
      "usd": "0.03581080574877608496",
      "usdt": "0.0358"
    },
    "btxtest2": {
      "btc": "0.00000529124896574590613284162594",
      "usd": "0.36891131732258715456",
      "usdt": "0.3688"
    },
    "orn": {
      "btc": "0.00001510760618473546409404075955",
      "usd": "1.0533178338955647336",
      "usdt": "1.053"
    },
    "ens": {
      "btc": "0.0000835007293401333343089432294",
      "usd": "5.821756688767508784",
      "usdt": "5.82"
    },
    "pda": {
      "btc": "0.00000014017218653833379316123288",
      "usd": "0.009772948943171574024",
      "usdt": "0.00977"
    },
    "bond": {
      "btc": "0.00003087518376975376897471577829",
      "usd": "2.1526495522727970624",
      "usdt": "2.152"
    },
    "tlm": {
      "btc": "0.00000002571019020232284107931723",
      "usd": "0.0017925408911119202304",
      "usdt": "0.001792"
    },
    "kp3r": {
      "btc": "0.00023644192775350469921157807914",
      "usd": "16.484974266475694976",
      "usdt": "16.48"
    },
    "lqty": {
      "btc": "0.00000414634205829871711602828064",
      "usd": "0.2890872307652594568",
      "usdt": "0.289"
    },
    "ckb": {
      "btc": "0.00000002196556986593541835515328",
      "usd": "0.0015314621117702845272",
      "usdt": "0.001531"
    },
    "bigtime": {
      "btc": "0.00000018751796090645063220238626",
      "usd": "0.013073945003812944984",
      "usdt": "0.01307"
    },
    "yfi": {
      "btc": "0.0382352996033428412256587124331",
      "usd": "2665.804394427046548",
      "usdt": "2665"
    },
    "xtz": {
      "btc": "0.00000515781996525394049554383006",
      "usd": "0.3596085102425978364",
      "usdt": "0.3595"
    },
    "dexe": {
      "btc": "0.00021263991573026050649361642663",
      "usd": "14.8254735196259875752",
      "usdt": "14.821"
    },
    "meme": {
      "btc": "0.0000000077044487380844674439695",
      "usd": "0.0005371620862316412744",
      "usdt": "0.000537"
    },
    "dego": {
      "btc": "0.00000230989990098994275321990721",
      "usd": "0.1610485956858365832",
      "usdt": "0.161"
    },
    "eos": {
      "btc": "0.00001118938467566494629339258155",
      "usd": "0.78013540233157733688",
      "usdt": "0.7799"
    },
    "alice": {
      "btc": "0.00000227116244923421079400441808",
      "usd": "0.15834778072713000696",
      "usdt": "0.1583"
    },
    "ooki": {
      "btc": "0.00000000170731731812300116542341",
      "usd": "0.0001190359185504009528",
      "usdt": "0.000119"
    },
    "rif": {
      "btc": "0.00000061836450765631386747688199",
      "usd": "0.04311300915564942072",
      "usdt": "0.0431"
    },
    "rune": {
      "btc": "0.00000596843701125351667912721365",
      "usd": "0.4161255640081243392",
      "usdt": "0.416"
    },
    "hook": {
      "btc": "0.00000011190819396100343773363526",
      "usd": "0.00780235432515233136",
      "usdt": "0.0078"
    },
    "skl": {
      "btc": "0.00000009885223799888636999804448",
      "usd": "0.006892079653884559368",
      "usdt": "0.00689"
    },
    "alpaca": {
      "btc": "0.00000321951265703194505479842967",
      "usd": "0.22446773212361322528",
      "usdt": "0.2244"
    },
    "tom2": {
      "btc": "0.01002482209825281180097730286387",
      "usd": "698.940902258165191176",
      "usdt": "698.73"
    },
    "gtc": {
      "btc": "0.00000195121979214057276048389677",
      "usd": "0.1360410497718868032",
      "usdt": "0.136"
    },
    "tom3": {
      "btc": "0.01002381779394803356499764203465",
      "usd": "698.870881129606131792",
      "usdt": "698.66"
    },
    "xec": {
      "btc": "0.00000000010071737456490309396027",
      "usd": "0.000007022118892637098224",
      "usdt": "0.00000702"
    },
    "ygg": {
      "btc": "0.00000055997138593563643265945949",
      "usd": "0.039041780680858396536",
      "usdt": "0.03903"
    },
    "1inch": {
      "btc": "0.00000134433304796743873277456711",
      "usd": "0.09372828208548377544",
      "usdt": "0.0937"
    },
    "id": {
      "btc": "0.00000044906749627941123090548507",
      "usd": "0.03130944748426512456",
      "usdt": "0.0313"
    },
    "portal": {
      "btc": "0.00000017431853290079381646970107",
      "usd": "0.01215366731417959308",
      "usdt": "0.01215"
    },
    "zil": {
      "btc": "0.00000005667145719820045885228965",
      "usd": "0.00395119225440406524",
      "usdt": "0.00395"
    },
    "axs": {
      "btc": "0.00001576757758501830488067501875",
      "usd": "1.0993317183772323288",
      "usdt": "1.099"
    },
    "btxtest": {
      "btc": "0.00000134863720927363117268739923",
      "usd": "0.0940283726364511728",
      "usdt": "0.094"
    },
    "comp": {
      "btc": "0.00035724538841397251276506639384",
      "usd": "24.90751573029398088",
      "usdt": "24.9"
    },
    "io": {
      "btc": "0.00000174175060857254068472606668",
      "usd": "0.12143664295814013168",
      "usdt": "0.1214"
    },
    "xvg": {
      "btc": "0.00000005261119836602559053451801",
      "usd": "0.0036681068346581537304",
      "usdt": "0.003667"
    },
    "iq": {
      "btc": "0.00000001582496640243420407951278",
      "usd": "0.0011033329257234642936",
      "usdt": "0.001103"
    },
    "pundix": {
      "btc": "0.00000210616959916350059734585328",
      "usd": "0.14684430960671310816",
      "usdt": "0.1468"
    },
    "unfi": {
      "btc": "0.00001923960103868020641035959976",
      "usd": "1.3414047628242661992",
      "usdt": "1.341"
    },
    "cream": {
      "btc": "0.00003012912914334707938982487659",
      "usd": "2.10063385677178152",
      "usdt": "2.1"
    },
    "forth": {
      "btc": "0.00000340028743189202753113737893",
      "usd": "0.2370715352642439144",
      "usdt": "0.237"
    },
    "clv": {
      "btc": "0.00000042137739187623986746626506",
      "usd": "0.029378864939708201544",
      "usdt": "0.02937"
    },
    "powr": {
      "btc": "0.00000092826412170216954120079501",
      "usd": "0.06471952882530203064",
      "usdt": "0.0647"
    },
    "zk": {
      "btc": "0.00000022539458040094410343530896",
      "usd": "0.015714741852326041752",
      "usdt": "0.01571"
    },
    "ctxc": {
      "btc": "0.00000090961275604200230157852246",
      "usd": "0.06341913643777664208",
      "usdt": "0.0634"
    },
    "ghst": {
      "btc": "0.00000154949807022927836861956508",
      "usd": "0.1080325983482630496",
      "usdt": "0.108"
    },
    "xvs": {
      "btc": "0.00003931133992989095120386674374",
      "usd": "2.740827032168895888",
      "usdt": "2.74"
    },
    "slp": {
      "btc": "0.00000000923959960395977101287963",
      "usd": "0.0006441943827433463328",
      "usdt": "0.000644"
    },
    "hft": {
      "btc": "0.00000021951222661581443555443839",
      "usd": "0.01530461809933726536",
      "usdt": "0.0153"
    },
    "beamx": {
      "btc": "0.00000002806313171637470823166546",
      "usd": "0.0019565903923074307872",
      "usdt": "0.001956"
    },
    "idex": {
      "btc": "0.00000002855093666440985142178643",
      "usd": "0.001990600654750402488",
      "usdt": "0.00199"
    },
    "hive": {
      "btc": "0.00000088235306776945018213058567",
      "usd": "0.0615185629483164588",
      "usdt": "0.0615"
    },
    "kmd": {
      "btc": "0.0000002338594309697892352638788",
      "usd": "0.01630491993589525656",
      "usdt": "0.0163"
    },
    "city": {
      "btc": "0.00000991391820859658659922332844",
      "usd": "0.6912085690615719192",
      "usdt": "0.691"
    },
    "steem": {
      "btc": "0.00000083816367835920779902550919",
      "usd": "0.058437633291717845904",
      "usdt": "0.05842"
    },
    "celr": {
      "btc": "0.0000000365997183069897140587825",
      "usd": "0.0025517699850594355512",
      "usdt": "0.002551"
    },
    "dot": {
      "btc": "0.00010489241103190976067571889175",
      "usd": "7.3132067270754736632",
      "usdt": "7.311"
    },
    "celo": {
      "btc": "0.00000118723116029141467595619454",
      "usd": "0.0827749769751737718",
      "usdt": "0.08275"
    },
    "rdnt": {
      "btc": "0.00000004705883028103734304696457",
      "usd": "0.003280990023910211136",
      "usdt": "0.00328"
    },
    "ton": {
      "btc": "0.00001846485200356556722604981722",
      "usd": "1.2873884636501346744",
      "usdt": "1.287"
    },
    "pros": {
      "btc": "0.00000053371600196786254919118353",
      "usd": "0.03721122831995727264",
      "usdt": "0.0372"
    },
    "prom": {
      "btc": "0.00003272597313141651813723359214",
      "usd": "2.2816884891887779272",
      "usdt": "2.281"
    },
    "ftm": {
      "btc": "0.00001003443472516997491678262795",
      "usd": "0.69961110448865904528",
      "usdt": "0.6994"
    },
    "knc": {
      "btc": "0.00000198278364171931731984466569",
      "usd": "0.13824171381231438384",
      "usdt": "0.1382"
    },
    "mav": {
      "btc": "0.00000022410333200908637146145932",
      "usd": "0.015624714687035822544",
      "usdt": "0.01562"
    },
    "bifi": {
      "btc": "0.00075466294901907446471656595647",
      "usd": "52.61587660295033712",
      "usdt": "52.6"
    },
    "ftt": {
      "btc": "0.0000042309905639871684343139791",
      "usd": "0.29498901160095160488",
      "usdt": "0.2949"
    },
    "rlc": {
      "btc": "0.00000615495066785518907534993907",
      "usd": "0.4291294878833782248",
      "usdt": "0.429"
    },
    "pha": {
      "btc": "0.00000044619805540861627096359698",
      "usd": "0.03110938711695352632",
      "usdt": "0.0311"
    },
    "manta": {
      "btc": "0.00000092941189805048752517755024",
      "usd": "0.064799552972226669936",
      "usdt": "0.06478"
    },
    "phb": {
      "btc": "0.00000199426140520249715961221802",
      "usd": "0.1390419552815607768",
      "usdt": "0.139"
    },
    "xaut": {
      "btc": "0.06850417051709763516465353868774",
      "usd": "4776.181191086902902288",
      "usdt": "4774.74"
    },
    "blz": {
      "btc": "0.00000083500729340133334308943229",
      "usd": "0.05821756688767508784",
      "usdt": "0.0582"
    },
    "lpt": {
      "btc": "0.00002987087946497553299505494908",
      "usd": "2.0826284237137376784",
      "usdt": "2.082"
    },
    "gft": {
      "btc": "0.00000002812052053379060743050322",
      "usd": "0.001960591599653662752",
      "usdt": "0.00196"
    },
    "api3": {
      "btc": "0.00000491678693210716386042523105",
      "usd": "0.34280343938842358424",
      "usdt": "0.3427"
    },
    "voxel": {
      "btc": "0.00000020086086095564719593216584",
      "usd": "0.0140042257118118768",
      "usdt": "0.014"
    },
    "waxp": {
      "btc": "0.00000009512196486685292207358997",
      "usd": "0.006632001176379481656",
      "usdt": "0.00663"
    },
    "mbl": {
      "btc": "0.00000001398852424512542971670441",
      "usd": "0.00097529429064404142",
      "usdt": "0.000975"
    },
    "snt": {
      "btc": "0.00000039024395842811455209677935",
      "usd": "0.02720820995437736064",
      "usdt": "0.0272"
    },
    "glmr": {
      "btc": "0.00000020803446313263459578688605",
      "usd": "0.0145043766300908724",
      "usdt": "0.0145"
    },
    "rose": {
      "btc": "0.00000015667147154540481282708936",
      "usd": "0.010923296055213263904",
      "usdt": "0.01092"
    },
    "snx": {
      "btc": "0.00000416068926265269191573772105",
      "usd": "0.290087532601817448",
      "usdt": "0.29"
    },
    "atom": {
      "btc": "0.00002532281568476552148716233675",
      "usd": "1.765532741524854468",
      "usdt": "1.765"
    },
    "fun": {
      "btc": "0.0000000074175046510049714497807",
      "usd": "0.0005171560495004814504",
      "usdt": "0.000517"
    },
    "arkm": {
      "btc": "0.00000195839339431756016033861698",
      "usd": "0.1365412006901657988",
      "usdt": "0.1365"
    },
    "magic": {
      "btc": "0.00000090961275604200230157852246",
      "usd": "0.06341913643777664208",
      "usdt": "0.0634"
    },
    "quick": {
      "btc": "0.0000001616929930692959927253935",
      "usd": "0.011273401698008560824",
      "usdt": "0.01127"
    },
    "data": {
      "btc": "0.00000001262553983149782374430757",
      "usd": "0.000880265616171032256",
      "usdt": "0.00088"
    },
    "cos": {
      "btc": "0.00000001644189618965512046701872",
      "usd": "0.0011463459046954579152",
      "usdt": "0.001146"
    },
    "usd": {
      "btc": "0.000014342875149907",
      "usd": "1",
      "usdt": "0.999698254519825925"
    },
    "qkc": {
      "btc": "0.0000000452941241454984426827034",
      "usd": "0.0031579528980135782184",
      "usdt": "0.003157"
    },
    "pyr": {
      "btc": "0.00000374462033638742272416394895",
      "usd": "0.2610787793416357032",
      "usdt": "0.261"
    },
    "dai": {
      "btc": "0",
      "usd": "0",
      "usdt": "0"
    },
    "sol": {
      "btc": "0.00123256832604997504303802626055",
      "usd": "85.935930778697023992",
      "usdt": "85.91"
    },
    "high": {
      "btc": "0.00000467718861939578470527757608",
      "usd": "0.3260983987179051312",
      "usdt": "0.326"
    },
    "burger": {
      "btc": "0.00000024677191488836655500237518",
      "usd": "0.01720519158879744864",
      "usdt": "0.0172"
    },
    "lazio": {
      "btc": "0.00000964132132587106540474396051",
      "usd": "0.6722028341669700864",
      "usdt": "0.672"
    },
    "dar": {
      "btc": "0.00000311434764911730977292823141",
      "usd": "0.217135519661643149784",
      "usdt": "0.21707"
    },
    "etc": {
      "btc": "0.00011979915635568957757382748548",
      "usd": "8.35252033525922652",
      "usdt": "8.35"
    },
    "ogn": {
      "btc": "0.00000031879488074532004954376608",
      "usd": "0.022226706808318564464",
      "usdt": "0.02222"
    },
    "bnb": {
      "btc": "0",
      "usd": "0",
      "usdt": "0"
    },
    "usdt": {
      "btc": "0.00001434720435397479970944041742",
      "usd": "1.0003018365579912",
      "usdt": "1"
    },
    "eth": {
      "btc": "0.04738852903709168394428750992991",
      "usd": "3303.976960114313773776",
      "usdt": "3302.98"
    },
    "neo": {
      "btc": "0.00004068867154787253197597302381",
      "usd": "2.8368560084784630432",
      "usdt": "2.836"
    },
    "lrc": {
      "btc": "0.00000026958396981118648654038544",
      "usd": "0.018795671508924654648",
      "usdt": "0.01879"
    },
    "ordi": {
      "btc": "0.00038436160464298488421590878268",
      "usd": "26.798086201388584248",
      "usdt": "26.79"
    },
    "saga": {
      "btc": "0.0000002853658946005587662207699",
      "usd": "0.019896003529138444968",
      "usdt": "0.01989"
    },
    "usdn": {
      "btc": "0.00001434720435397479970944041742",
      "usd": "1.0003018365579912",
      "usdt": "1"
    },
    "pengu": {
      "btc": "0.00000010197992854805287633470249",
      "usd": "0.0071101454542542014496",
      "usdt": "0.007108"
    },
    "lista": {
      "btc": "0.00000127977062837455213408208523",
      "usd": "0.08922692382097281504",
      "usdt": "0.0892"
    },
    "spell": {
      "btc": "0.00000000233429014839169991272596",
      "usd": "0.00016274910880798516824",
      "usdt": "0.0001627"
    },
    "mtl": {
      "btc": "0.00000420373087571461631486604231",
      "usd": "0.2930884381114914216",
      "usdt": "0.293"
    },
    "trb": {
      "btc": "0.00027446201929153791844159518531",
      "usd": "19.135774133354371656",
      "usdt": "19.13"
    },
    "alt": {
      "btc": "0.00000010157820682614158194283816",
      "usd": "0.007082137002830577696",
      "usdt": "0.00708"
    },
    "bnt": {
      "btc": "0.00000438450565057469879120499156",
      "usd": "0.30569224125212211072",
      "usdt": "0.3056"
    },
    "oxt": {
      "btc": "0.00000014634148441054295703629226",
      "usd": "0.01020307873289151024",
      "usdt": "0.0102"
    },
    "lever": {
      "btc": "0.00000000251076076194558994915207",
      "usd": "0.00017505282139764846",
      "usdt": "0.000175"
    },
    "usdc": {
      "btc": "0.00001433988727975427256158860281",
      "usd": "0.999791682621346624488",
      "usdt": "0.99949"
    },
    "utk": {
      "btc": "0.00000011406027461409965769005132",
      "usd": "0.00795239960063603004",
      "usdt": "0.00795"
    },
    "bnx": {
      "btc": "0.00002556528343834769560225187981",
      "usd": "1.78243784256268451928",
      "usdt": "1.7819"
    },
    "aergo": {
      "btc": "0.00000091104747647739978154946651",
      "usd": "0.0635191666214324412",
      "usdt": "0.0635"
    },
    "ilv": {
      "btc": "0.00006470589163642634668957628258",
      "usd": "4.511361282876540312",
      "usdt": "4.51"
    },
    "hifi": {
      "btc": "0.00000182209495295479956309893301",
      "usd": "0.1270383332428648824",
      "usdt": "0.127"
    },
    "egld": {
      "btc": "0.00005882353785129667880870571144",
      "usd": "4.10123752988776392",
      "usdt": "4.1"
    },
    "tru": {
      "btc": "0.00000006312769915748911872153784",
      "usd": "0.00440132808085516128",
      "usdt": "0.0044"
    },
    "alpine": {
      "btc": "0.00000622668668962506307389714116",
      "usd": "0.4341309970661681808",
      "usdt": "0.434"
    },
    "amb": {
      "btc": "0.00000000459110539327193590702093",
      "usd": "0.000320096587698557184",
      "usdt": "0.00032"
    },
    "edu": {
      "btc": "0.00000060401730330233906776744157",
      "usd": "0.04211270731909142952",
      "usdt": "0.0421"
    },
    "nfp": {
      "btc": "0.00000020487807817476013985080916",
      "usd": "0.014284310226048114336",
      "usdt": "0.01428"
    },
    "ustc": {
      "btc": "0.00000007474893468420870648618457",
      "usd": "0.005211572568467134152",
      "usdt": "0.00521"
    },
    "trx": {
      "btc": "0.00000478479265205059570309837921",
      "usd": "0.3336006624920900652",
      "usdt": "0.3335"
    },
    "dash": {
      "btc": "0.00049010050073177915807448465918",
      "usd": "34.170310736820979392",
      "usdt": "34.16"
    },
    "nuls": {
      "btc": "0.00000037015787233254983250356277",
      "usd": "0.02580778738319617296",
      "usdt": "0.0258"
    },
    "mdx": {
      "btc": "0.0000004949785502121305899756944",
      "usd": "0.0345104133612506964",
      "usdt": "0.0345"
    },
    "joe": {
      "btc": "0.00000067431860463681558634369962",
      "usd": "0.0470141863182255864",
      "usdt": "0.047"
    },
    "pond": {
      "btc": "0.000000034433290449539519302657",
      "usd": "0.00240072440773917888",
      "usdt": "0.0024"
    },
    "lina": {
      "btc": "0.00000000483500786728950750208142",
      "usd": "0.0003371017189200430344",
      "usdt": "0.000337"
    },
    "lsk": {
      "btc": "0.00000183644215730877436280837343",
      "usd": "0.1280386350794228736",
      "usdt": "0.128"
    },
    "amp": {
      "btc": "0.0000000124964149923120505469226",
      "usd": "0.0008712628996420103352",
      "usdt": "0.000871"
    },
    "pendle": {
      "btc": "0.00001857962963839736562372534056",
      "usd": "1.295390878342598604",
      "usdt": "1.295"
    },
    "dydx": {
      "btc": "0.00000218723130376345821570419164",
      "usd": "0.15249601498326575844",
      "usdt": "0.15245"
    },
    "busd": {
      "btc": "0.00001435150851528099214935324955",
      "usd": "1.00060192710895859736",
      "usdt": "1.0003"
    },
    "akro": {
      "btc": "0.00000001407460747124927851496105",
      "usd": "0.0009812961016633893672",
      "usdt": "0.000981"
    },
    "alcx": {
      "btc": "0.00007560976694544719446875099982",
      "usd": "5.271590678660613624",
      "usdt": "5.27"
    },
    "qtum": {
      "btc": "0.00001291248391857731973849637568",
      "usd": "0.90027165290219208",
      "usdt": "0.9"
    },
    "arpa": {
      "btc": "0.0000001408895467560325331467049",
      "usd": "0.009822964034999473584",
      "usdt": "0.00982"
    },
    "coti": {
      "btc": "0.00000020315641365228316388567631",
      "usd": "0.014164274005661155392",
      "usdt": "0.01416"
    },
    "dcr": {
      "btc": "0.00029081783225506919011035726117",
      "usd": "20.276118227030481624",
      "usdt": "20.27"
    },
    "og": {
      "btc": "0.000042654238544367079536166361",
      "usd": "2.9738973600869078376",
      "usdt": "2.973"
    },
    "ethfi": {
      "btc": "0.00000678622765943008026256531744",
      "usd": "0.4731427686919298376",
      "usdt": "0.473"
    },
    "flux": {
      "btc": "0.00000089956971299421994178191417",
      "usd": "0.06271892515218604824",
      "usdt": "0.0627"
    },
    "ltc": {
      "btc": "0.00185667171544787883039868441832",
      "usd": "129.449060668969641192",
      "usdt": "129.41"
    },
    "win": {
      "btc": "0.00000000029311338495170515806387",
      "usd": "0.000020436166520879760216",
      "usdt": "0.00002043"
    },
    "beta": {
      "btc": "0.00000000516499356743092789539855",
      "usd": "0.000360108661160876832",
      "usdt": "0.00036"
    },
    "om": {
      "btc": "0.00000095982797128091410056156393",
      "usd": "0.06692019286572961128",
      "usdt": "0.0669"
    },
    "fxs": {
      "btc": "0.00001164992993542753736406561895",
      "usd": "0.8122450912850888544",
      "usdt": "0.812"
    },
    "pla": {
      "btc": "0.00000336728886187788549180566597",
      "usd": "0.23477084104016053464",
      "usdt": "0.2347"
    },
    "ant": {
      "btc": "0.00010626974264989134144782517185",
      "usd": "7.4092357033850408184",
      "usdt": "7.407"
    },
    "vgx": {
      "btc": "0.00000025824967837154639476992751",
      "usd": "0.0180054330580438416",
      "usdt": "0.018"
    },
    "lto": {
      "btc": "0.00000005451937654510423889587359",
      "usd": "0.00380114697892036656",
      "usdt": "0.0038"
    },
    "crv": {
      "btc": "0.0000032410334635629072543625903",
      "usd": "0.22596818487845021208",
      "usdt": "0.2259"
    },
    "aeur": {
      "btc": "0.00001668579866367269206207920546",
      "usd": "1.1633510359169437656",
      "usdt": "1.163"
    },
    "movr": {
      "btc": "0.00002835007580345420422585426483",
      "usd": "1.9765964290385906112",
      "usdt": "1.976"
    },
    "srm": {
      "btc": "0.00000350674368819852054498142683",
      "usd": "0.244493774891504209104",
      "usdt": "0.24442"
    },
    "badger": {
      "btc": "0.00001093256971772879737859359808",
      "usd": "0.7622299994571892944",
      "usdt": "0.762"
    },
    "rpl": {
      "btc": "0.00002682927214193287545665358058",
      "usd": "1.870564434363443544",
      "usdt": "1.87"
    },
    "super": {
      "btc": "0.0000016327118554823322069343195",
      "usd": "0.11383434900029939856",
      "usdt": "0.1138"
    },
    "aevo": {
      "btc": "0.00000035581066797857503279412235",
      "usd": "0.02480748554663818176",
      "usdt": "0.0248"
    },
    "pols": {
      "btc": "0.00000441750422058884083053670452",
      "usd": "0.30799293547620549048",
      "usdt": "0.3079"
    },
    "cyber": {
      "btc": "0.00000741750465100497144978069581",
      "usd": "0.5171560495004814504",
      "usdt": "0.517"
    },
    "qnt": {
      "btc": "0.00104978494258033609473975534286",
      "usd": "73.192085380948216104",
      "usdt": "73.17"
    },
    "ldo": {
      "btc": "0.00000540602660057770453051714929",
      "usd": "0.37691373201505108416",
      "usdt": "0.3768"
    },
    "bake": {
      "btc": "0.00000074461990597129210491995766",
      "usd": "0.05191566531735974328",
      "usdt": "0.0519"
    },
    "agix": {
      "btc": "0.00000881061819377592450156736034",
      "usd": "0.61428535783026239592",
      "usdt": "0.6141"
    },
    "xlm": {
      "btc": "0.00000240889561103236887121504609",
      "usd": "0.16795067835808672248",
      "usdt": "0.1679"
    },
    "stmx": {
      "btc": "0.00000006549498787589496067359551",
      "usd": "0.004566377883887229828",
      "usdt": "0.004565"
    },
    "front": {
      "btc": "0.00001262553983149782374430756733",
      "usd": "0.880265616171032256",
      "usdt": "0.88"
    },
    "gala": {
      "btc": "0.00000004605452597625910706730374",
      "usd": "0.003210968895351151752",
      "usdt": "0.00321"
    },
    "rndr": {
      "btc": "0.00010086084660844284195736613449",
      "usd": "7.032121911002678136",
      "usdt": "7.03"
    }
  },
  "ts": 1776593066253
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:26.399381" elapsed="0.000672"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:26.401337" level="INFO">${data} = {'uft': {'btc': '0.00000012769011875037571741401972', 'usd': '0.00890268634536612168', 'usdt': '0.0089'}, 'ksm': {'btc': '0.00007044477337801626657335244955', 'usd': '4.911482017499736792', 'usdt': '4...</msg>
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-19T18:04:26.400163" elapsed="0.001199"/>
</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-04-19T18:04:26.401457" 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-04-19T18:04:26.401761" elapsed="0.000136"/>
</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-04-19T18:04:26.402571" elapsed="0.000168"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-04-19T18:04:26.403055" 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-04-19T18:04:26.402830" elapsed="0.000248"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.403295" 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', '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-04-19T18:04:26.403162" elapsed="0.000184"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:26.403706" 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-04-19T18:04:26.403547" elapsed="0.000221">Dictionary does not contain key 'rates'.</status>
</kw>
<msg time="2026-04-19T18:04:26.403841" 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-04-19T18:04:26.403434" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:26.404198" 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-04-19T18:04:26.404068" elapsed="0.000175">Dictionary does not contain key 'base'.</status>
</kw>
<msg time="2026-04-19T18:04:26.404312" 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-04-19T18:04:26.403958" elapsed="0.000373"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:26.404653" 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-04-19T18:04:26.404527" elapsed="0.000168">Dictionary does not contain key 'timestamp'.</status>
</kw>
<msg time="2026-04-19T18:04:26.404765" 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-04-19T18:04:26.404421" elapsed="0.000362"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:26.405107" 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-04-19T18:04:26.404982" elapsed="0.000166">Dictionary does not contain key 'date'.</status>
</kw>
<msg time="2026-04-19T18:04:26.405215" 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-04-19T18:04:26.404871" elapsed="0.000381"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:26.405580" 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-04-19T18:04:26.405454" elapsed="0.000167">Dictionary does not contain key 'success'.</status>
</kw>
<msg time="2026-04-19T18:04:26.405690" 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-04-19T18:04:26.405346" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.405897" 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-04-19T18:04:26.405794" elapsed="0.000137"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.406104" 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-04-19T18:04:26.406009" elapsed="0.000126"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.406310" 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-04-19T18:04:26.406213" elapsed="0.000129"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.406513" 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-04-19T18:04:26.406419" elapsed="0.000127"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.406713" 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-04-19T18:04:26.406622" elapsed="0.000123"/>
</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-04-19T18:04:26.406829" elapsed="0.000086"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_base}</arg>
<arg>验证基础货币</arg>
<arg>${convert_dict['base']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:26.407002" elapsed="0.000085"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${has_success}</arg>
<arg>验证成功标记</arg>
<arg>${convert_dict['success']}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:26.407178" elapsed="0.000179"/>
</kw>
<arg>${data}</arg>
<doc>验证价格转换字典的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:26.402279" elapsed="0.005135"/>
</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-04-19T18:04:26.401995" elapsed="0.005456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.407937" 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-04-19T18:04:26.407535" elapsed="0.000437"/>
</kw>
<doc>验证货币价格转换接口功能</doc>
<tag>spot</tag>
<status status="PASS" start="2026-04-19T18:04:25.362561" elapsed="1.045513"/>
</test>
<test id="s1-s4-s1-s2-t2" name="获取单一货币价格转换" line="37">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.409391" 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-04-19T18:04:26.409228" elapsed="0.000182"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.410577" 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-04-19T18:04:26.410111" 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-04-19T18:04:26.411090" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:26.410705" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:26.410684" elapsed="0.000473"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:26.411182" elapsed="0.000030"/>
</return>
<msg time="2026-04-19T18:04:26.411342" 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-04-19T18:04:26.409572" elapsed="0.001788"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:26.761358" 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-04-19T18:04:26.761856" 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': 'Sun, 19 Apr 2026 10:04:26 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': '141.11.146.71', 'X-Trace-ID': '9dde51005b2315e6426b339b4ecbdaf3', 'X-Transparent': '00-9dde51005b2315e6426b339b4ecbdaf3-dd1954f0cf35324a-01', 'X-Upstream-Addr': '10.9.166.220:8080', 'X-Upstream-Header-Time': '0.007', 'X-Upstream-Service': 'default-spot-gateway-app-80', 'X-Upstream-Status': '200', 'cf-cache-status': 'DYNAMIC', 'Content-Encoding': 'gzip', 'Server': 'cloudflare', 'CF-RAY': '9eeb15caa8685333-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"uft":{"usd":"0.00890268634536612168"},"ksm":{"usd":"4.911482017499736792"},"vanry":{"usd":"0.005361617843950832832"},"pyth":{"usd":"0.04421334117586321104"},"bal":{"usd":"0.9672918759515774904"},"fio":{"usd":"0.002110636875137361432"},"mbox":{"usd":"0.01260380314063068912"},"theta":{"usd":"0.2130642911868521256"},"vib":{"usd":"0.002230673095524320376"},"fis":{"usd":"0.01910576507825763192"},"vic":{"usd":"0.05431638972509892216"},"bar":{"usd":"0.4681412595091398816"},"stpt":{"usd":"0.070441255330413740304"},"rad":{"usd":"0.27508300505344758"},"bat":{"usd":"0.09912991200289692792"},"cake":{"usd":"1.5284612062606105536"},"ssv":{"usd":"2.4677446307885642904"},"ape":{"usd":"0.10063036475773391472"},"qi":{"usd":"0.001480446718105826976"},"farm":{"usd":"11.443453010223419328"},"ctk":{"usd":"0.1755529723159274556"},"band":{"usd":"0.2130642911868521256"},"iotx":{"usd":"0.004571379393070019784"},"near":{"usd":"5.2725909804971716152"},"shib":{"usd":"0.000008512568629108505112"},"xmr":{"usd":"118.73582799943355544"},"dock":{"usd":"0.00390117716257616568"},"astr":{"usd":"0.0079003839051350144976"},"waves":{"usd":"1.0763247761363985312"},"reef":{"usd":"0.0006882076635518979456"},"iris":{"usd":"0.005211572568467134152"},"apt":{"usd":"0.930280707998931816"},"stg":{"usd":"0.20726254053481577664"},"ai":{"usd":"0.0215064894859968108"},"combo":{"usd":"0.02760833068900055712"},"dent":{"usd":"0.0000870262597805452344"},"kda":{"usd":"0.0060018110193479472"},"metis":{"usd":"3.661104721802247792"},"glm":{"usd":"0.12893890673232506568"},"loka":{"usd":"0.12373733718222351144"},"ray":{"usd":"0.6461949864164623152"},"wld":{"usd":"0.26127883970894730144"},"agld":{"usd":"0.265079986687867668"},"iost":{"usd":"0.0010973311147041163464"},"zro":{"usd":"1.5844781091078580608"},"wing":{"usd":"0.3260983987179051312"},"dgb":{"usd":"0.004381322044124001456"},"bb":{"usd":"0.02560772701588457472"},"zrx":{"usd":"0.10573190412417966984"},"sui":{"usd":"0.94188420930300451392"},"bsw":{"usd":"0.01120338056944950144"},"omg":{"usd":"0.3831156034017106296"},"blur":{"usd":"0.03020911546405133424"},"jst":{"usd":"0.071841677901594927984"},"pol":{"usd":"0.08882680308634961856"},"pivx":{"usd":"0.07942396582270450128"},"gmt":{"usd":"0.01110335038579370232"},"nkn":{"usd":"0.00730220340687333576"},"porto":{"usd":"0.9462855373838596752"},"rsr":{"usd":"0.00170051312214858504"},"sc":{"usd":"0.0009762945924805994112"},"twt":{"usd":"0.40152115719437766768"},"arb":{"usd":"0.12523778993706049824"},"btc":{"usd":"69721.028005073621060088"},"cvc":{"usd":"0.030369163757900612832"},"ardr":{"usd":"0.043643169129025156056"},"vite":{"usd":"0.000860259579439872432"},"gmx":{"usd":"6.271892515218604824"},"sei":{"usd":"0.055026604029055095912"},"matic":{"usd":"0.37951451679010186128"},"audio":{"usd":"0.019595912978171047608"},"ark":{"usd":"0.16975122166389110664"},"cvp":{"usd":"0.03391023225931590168"},"key":{"usd":"0.0012533782012071629736"},"btt":{"usd":"0"},"cvx":{"usd":"1.77553575989043438"},"flm":{"usd":"0.01670504067051845304"},"one":{"usd":"0.002210667058793160552"},"btx":{"usd":"0.17995430039678261688"},"ong":{"usd":"0.080204201255219734416"},"gno":{"usd":"120.476353195044460128"},"storj":{"usd":"0.10133057604332450856"},"gns":{"usd":"0.6872073617153399544"},"people":{"usd":"0.007442245663991454528"},"tnsr":{"usd":"0.03811149997285946472"},"bttc":{"usd":"0.000000320096587698557184"},"vtho":{"usd":"0.000570172046838054984"},"polyx":{"usd":"0.05011512201155535912"},"t":{"usd":"0.006231880441756285176"},"ont":{"usd":"0.075582806770321815072"},"mana":{"usd":"0.09142758786140039568"},"cfx":{"usd":"0.059047817412018220536"},"w":{"usd":"0.01250377295697489"},"dodo":{"usd":"0.017425257992840206704"},"ankr":{"usd":"0.005021515219521115824"},"mina":{"usd":"0.05771741596939609224"},"sfp":{"usd":"0.30029061133470895824"},"dia":{"usd":"0.19745958253654746288"},"aca":{"usd":"0.00180054330580438416"},"algo":{"usd":"0.10433148155299848216"},"asr":{"usd":"1.3043935948716205248"},"df":{"usd":"0.001640495011955105568"},"ast":{"usd":"0.02610787793416357032"},"jup":{"usd":"0.17465270066302526352"},"dusk":{"usd":"0.14794464162692689848"},"doge":{"usd":"0.09812961016633893672"},"bel":{"usd":"0.11023326238869063024"},"acm":{"usd":"0.4231276768640302776"},"juv":{"usd":"0.5071530311349015384"},"bome":{"usd":"0.0005361617843950832832"},"tia":{"usd":"0.39481913488943912664"},"ata":{"usd":"0.01090329001848210408"},"nmr":{"usd":"8.362523353624806432"},"loom":{"usd":"0.048324581724116554872"},"paxg":{"usd":"4777.421565364234811376"},"lit":{"usd":"0.7432242645625874616"},"woo":{"usd":"0.2120639893502941344"},"rei":{"usd":"0.004011210364597544712"},"rare":{"usd":"0.01560470865030466272"},"zec":{"usd":"323.367574704101815224"},"ren":{"usd":"0.042752900494488543888"},"atm":{"usd":"1.1043332275600222848"},"hbar":{"usd":"0.087686458992673508592"},"rep":{"usd":"4.731427686919298376"},"elf":{"usd":"0.22726857726597560064"},"pepe":{"usd":"0.000003721122831995727264"},"icx":{"usd":"0.0380114697892036656"},"req":{"usd":"0.11043332275600222848"},"xai":{"usd":"0.010613202485880286632"},"strax":{"usd":"0.013243996316027803488"},"chess":{"usd":"0.002810848160727955272"},"tusd":{"usd":"0.9993015347214332088"},"ctsi":{"usd":"0.033760186983832203"},"sxp":{"usd":"0.00220066404042758064"},"rvn":{"usd":"0.00585176574386424852"},"chr":{"usd":"0.018315526627376818872"},"fida":{"usd":"0.016164877678777137792"},"ntrn":{"usd":"0.00160048293849278592"},"sand":{"usd":"0.07872375453711390744"},"osmo":{"usd":"0.03280990023910211136"},"kava":{"usd":"0.055586773057527570984"},"ocean":{"usd":"0.61248481452445801176"},"vidt":{"usd":"0.00115034711204168988"},"adx":{"usd":"0.0795239960063603004"},"chz":{"usd":"0.040232139866362406064"},"xrp":{"usd":"2.13834523601001778824"},"c98":{"usd":"0.02110636875137361432"},"psg":{"usd":"0.835252033525922652"},"perp":{"usd":"0.1250377295697489"},"for":{"usd":"0.003060923619867453072"},"uma":{"usd":"0.4431337135951901016"},"syn":{"usd":"0.05141551439908074768"},"jasmy":{"usd":"0.00555167519289685116"},"sys":{"usd":"0.010433148155299848216"},"lunc":{"usd":"0.000042592852200639265296"},"luna":{"usd":"0.05681714431649390016"},"auction":{"usd":"4.681412595091398816"},"not":{"usd":"0.0003831156034017106296"},"gal":{"usd":"2.5427672685304136304"},"yfii":{"usd":"435.6314498210051676"},"alpha":{"usd":"0.00970292781461251464"},"tko":{"usd":"0.06291898551949764648"},"pixel":{"usd":"0.007612296976206313032"},"nexo":{"usd":"0.8892683327000541768"},"bico":{"usd":"0.0240072440773917888"},"troy":{"usd":"0.0000690208267225013928"},"mask":{"usd":"0.460138844816675952"},"enj":{"usd":"0.068260597326717319488"},"aave":{"usd":"92.908034579506222656"},"wan":{"usd":"0.055886863608494968344"},"gm":{"usd":"714.76567731251261196"},"oax":{"usd":"0.03581080574877608496"},"btxtest2":{"usd":"0.36891131732258715456"},"orn":{"usd":"1.0533178338955647336"},"ens":{"usd":"5.821756688767508784"},"pda":{"usd":"0.009772948943171574024"},"bond":{"usd":"2.1526495522727970624"},"tlm":{"usd":"0.0017925408911119202304"},"kp3r":{"usd":"16.484974266475694976"},"lqty":{"usd":"0.2890872307652594568"},"ckb":{"usd":"0.0015314621117702845272"},"bigtime":{"usd":"0.013073945003812944984"},"yfi":{"usd":"2665.804394427046548"},"xtz":{"usd":"0.3596085102425978364"},"dexe":{"usd":"14.8254735196259875752"},"meme":{"usd":"0.0005371620862316412744"},"dego":{"usd":"0.1610485956858365832"},"eos":{"usd":"0.78013540233157733688"},"alice":{"usd":"0.15834778072713000696"},"ooki":{"usd":"0.0001190359185504009528"},"rif":{"usd":"0.04311300915564942072"},"rune":{"usd":"0.4161255640081243392"},"hook":{"usd":"0.00780235432515233136"},"skl":{"usd":"0.006892079653884559368"},"alpaca":{"usd":"0.22446773212361322528"},"tom2":{"usd":"698.940902258165191176"},"gtc":{"usd":"0.1360410497718868032"},"tom3":{"usd":"698.870881129606131792"},"xec":{"usd":"0.000007022118892637098224"},"ygg":{"usd":"0.039041780680858396536"},"1inch":{"usd":"0.09372828208548377544"},"id":{"usd":"0.03130944748426512456"},"portal":{"usd":"0.01215366731417959308"},"zil":{"usd":"0.00395119225440406524"},"axs":{"usd":"1.0993317183772323288"},"btxtest":{"usd":"0.0940283726364511728"},"comp":{"usd":"24.90751573029398088"},"io":{"usd":"0.12143664295814013168"},"xvg":{"usd":"0.0036681068346581537304"},"iq":{"usd":"0.0011033329257234642936"},"pundix":{"usd":"0.14684430960671310816"},"unfi":{"usd":"1.3414047628242661992"},"cream":{"usd":"2.10063385677178152"},"forth":{"usd":"0.2370715352642439144"},"clv":{"usd":"0.029378864939708201544"},"powr":{"usd":"0.06471952882530203064"},"zk":{"usd":"0.015714741852326041752"},"ctxc":{"usd":"0.06341913643777664208"},"ghst":{"usd":"0.1080325983482630496"},"xvs":{"usd":"2.740827032168895888"},"slp":{"usd":"0.0006441943827433463328"},"hft":{"usd":"0.01530461809933726536"},"beamx":{"usd":"0.0019565903923074307872"},"idex":{"usd":"0.001990600654750402488"},"hive":{"usd":"0.0615185629483164588"},"kmd":{"usd":"0.01630491993589525656"},"city":{"usd":"0.6912085690615719192"},"steem":{"usd":"0.058437633291717845904"},"celr":{"usd":"0.0025517699850594355512"},"dot":{"usd":"7.3132067270754736632"},"celo":{"usd":"0.0827749769751737718"},"rdnt":{"usd":"0.003280990023910211136"},"ton":{"usd":"1.2873884636501346744"},"pros":{"usd":"0.03721122831995727264"},"prom":{"usd":"2.2816884891887779272"},"ftm":{"usd":"0.69961110448865904528"},"knc":{"usd":"0.13824171381231438384"},"mav":{"usd":"0.015624714687035822544"},"bifi":{"usd":"52.61587660295033712"},"ftt":{"usd":"0.29498901160095160488"},"rlc":{"usd":"0.4291294878833782248"},"pha":{"usd":"0.03110938711695352632"},"manta":{"usd":"0.064799552972226669936"},"phb":{"usd":"0.1390419552815607768"},"xaut":{"usd":"4776.181191086902902288"},"blz":{"usd":"0.05821756688767508784"},"lpt":{"usd":"2.0826284237137376784"},"gft":{"usd":"0.001960591599653662752"},"api3":{"usd":"0.34280343938842358424"},"voxel":{"usd":"0.0140042257118118768"},"waxp":{"usd":"0.006632001176379481656"},"mbl":{"usd":"0.00097529429064404... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-19T18:04:26.762251" 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-04-19T18:04:26.762576" 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-04-19T18:04:26.411437" elapsed="0.351200"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.764463" 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-04-19T18:04:26.763103" elapsed="0.001517"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.767124" level="INFO">${resp_json} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'uft': {'usd': '0.00890268634536612168'}, 'ksm': {'usd': '4.911482017499736792'}, 'vanry': {'usd': '0.005361617843950832832'}, 'pyth': {'usd': '0....</msg>
<var>${resp_json}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-19T18:04:26.764961" elapsed="0.002230"/>
</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-04-19T18:04:26.767482" elapsed="0.000352"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.772003" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "uft": {
      "usd": "0.00890268634536612168"
    },
    "ksm": {
      "usd": "4.911482017499736792"
    },
    "vanry": {
      "...</msg>
<var>${json_str}</var>
<arg>json.dumps($resp_json, ensure_ascii=False, indent=2)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-19T18:04:26.768084" elapsed="0.003968"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.772611" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "uft": {
      "usd": "0.00890268634536612168"
    },
    "ksm": {
      "usd": "4.911482017499736792"
    },
    "vanry": {
      "usd": "0.005361617843950832832"
    },
    "pyth": {
      "usd": "0.04421334117586321104"
    },
    "bal": {
      "usd": "0.9672918759515774904"
    },
    "fio": {
      "usd": "0.002110636875137361432"
    },
    "mbox": {
      "usd": "0.01260380314063068912"
    },
    "theta": {
      "usd": "0.2130642911868521256"
    },
    "vib": {
      "usd": "0.002230673095524320376"
    },
    "fis": {
      "usd": "0.01910576507825763192"
    },
    "vic": {
      "usd": "0.05431638972509892216"
    },
    "bar": {
      "usd": "0.4681412595091398816"
    },
    "stpt": {
      "usd": "0.070441255330413740304"
    },
    "rad": {
      "usd": "0.27508300505344758"
    },
    "bat": {
      "usd": "0.09912991200289692792"
    },
    "cake": {
      "usd": "1.5284612062606105536"
    },
    "ssv": {
      "usd": "2.4677446307885642904"
    },
    "ape": {
      "usd": "0.10063036475773391472"
    },
    "qi": {
      "usd": "0.001480446718105826976"
    },
    "farm": {
      "usd": "11.443453010223419328"
    },
    "ctk": {
      "usd": "0.1755529723159274556"
    },
    "band": {
      "usd": "0.2130642911868521256"
    },
    "iotx": {
      "usd": "0.004571379393070019784"
    },
    "near": {
      "usd": "5.2725909804971716152"
    },
    "shib": {
      "usd": "0.000008512568629108505112"
    },
    "xmr": {
      "usd": "118.73582799943355544"
    },
    "dock": {
      "usd": "0.00390117716257616568"
    },
    "astr": {
      "usd": "0.0079003839051350144976"
    },
    "waves": {
      "usd": "1.0763247761363985312"
    },
    "reef": {
      "usd": "0.0006882076635518979456"
    },
    "iris": {
      "usd": "0.005211572568467134152"
    },
    "apt": {
      "usd": "0.930280707998931816"
    },
    "stg": {
      "usd": "0.20726254053481577664"
    },
    "ai": {
      "usd": "0.0215064894859968108"
    },
    "combo": {
      "usd": "0.02760833068900055712"
    },
    "dent": {
      "usd": "0.0000870262597805452344"
    },
    "kda": {
      "usd": "0.0060018110193479472"
    },
    "metis": {
      "usd": "3.661104721802247792"
    },
    "glm": {
      "usd": "0.12893890673232506568"
    },
    "loka": {
      "usd": "0.12373733718222351144"
    },
    "ray": {
      "usd": "0.6461949864164623152"
    },
    "wld": {
      "usd": "0.26127883970894730144"
    },
    "agld": {
      "usd": "0.265079986687867668"
    },
    "iost": {
      "usd": "0.0010973311147041163464"
    },
    "zro": {
      "usd": "1.5844781091078580608"
    },
    "wing": {
      "usd": "0.3260983987179051312"
    },
    "dgb": {
      "usd": "0.004381322044124001456"
    },
    "bb": {
      "usd": "0.02560772701588457472"
    },
    "zrx": {
      "usd": "0.10573190412417966984"
    },
    "sui": {
      "usd": "0.94188420930300451392"
    },
    "bsw": {
      "usd": "0.01120338056944950144"
    },
    "omg": {
      "usd": "0.3831156034017106296"
    },
    "blur": {
      "usd": "0.03020911546405133424"
    },
    "jst": {
      "usd": "0.071841677901594927984"
    },
    "pol": {
      "usd": "0.08882680308634961856"
    },
    "pivx": {
      "usd": "0.07942396582270450128"
    },
    "gmt": {
      "usd": "0.01110335038579370232"
    },
    "nkn": {
      "usd": "0.00730220340687333576"
    },
    "porto": {
      "usd": "0.9462855373838596752"
    },
    "rsr": {
      "usd": "0.00170051312214858504"
    },
    "sc": {
      "usd": "0.0009762945924805994112"
    },
    "twt": {
      "usd": "0.40152115719437766768"
    },
    "arb": {
      "usd": "0.12523778993706049824"
    },
    "btc": {
      "usd": "69721.028005073621060088"
    },
    "cvc": {
      "usd": "0.030369163757900612832"
    },
    "ardr": {
      "usd": "0.043643169129025156056"
    },
    "vite": {
      "usd": "0.000860259579439872432"
    },
    "gmx": {
      "usd": "6.271892515218604824"
    },
    "sei": {
      "usd": "0.055026604029055095912"
    },
    "matic": {
      "usd": "0.37951451679010186128"
    },
    "audio": {
      "usd": "0.019595912978171047608"
    },
    "ark": {
      "usd": "0.16975122166389110664"
    },
    "cvp": {
      "usd": "0.03391023225931590168"
    },
    "key": {
      "usd": "0.0012533782012071629736"
    },
    "btt": {
      "usd": "0"
    },
    "cvx": {
      "usd": "1.77553575989043438"
    },
    "flm": {
      "usd": "0.01670504067051845304"
    },
    "one": {
      "usd": "0.002210667058793160552"
    },
    "btx": {
      "usd": "0.17995430039678261688"
    },
    "ong": {
      "usd": "0.080204201255219734416"
    },
    "gno": {
      "usd": "120.476353195044460128"
    },
    "storj": {
      "usd": "0.10133057604332450856"
    },
    "gns": {
      "usd": "0.6872073617153399544"
    },
    "people": {
      "usd": "0.007442245663991454528"
    },
    "tnsr": {
      "usd": "0.03811149997285946472"
    },
    "bttc": {
      "usd": "0.000000320096587698557184"
    },
    "vtho": {
      "usd": "0.000570172046838054984"
    },
    "polyx": {
      "usd": "0.05011512201155535912"
    },
    "t": {
      "usd": "0.006231880441756285176"
    },
    "ont": {
      "usd": "0.075582806770321815072"
    },
    "mana": {
      "usd": "0.09142758786140039568"
    },
    "cfx": {
      "usd": "0.059047817412018220536"
    },
    "w": {
      "usd": "0.01250377295697489"
    },
    "dodo": {
      "usd": "0.017425257992840206704"
    },
    "ankr": {
      "usd": "0.005021515219521115824"
    },
    "mina": {
      "usd": "0.05771741596939609224"
    },
    "sfp": {
      "usd": "0.30029061133470895824"
    },
    "dia": {
      "usd": "0.19745958253654746288"
    },
    "aca": {
      "usd": "0.00180054330580438416"
    },
    "algo": {
      "usd": "0.10433148155299848216"
    },
    "asr": {
      "usd": "1.3043935948716205248"
    },
    "df": {
      "usd": "0.001640495011955105568"
    },
    "ast": {
      "usd": "0.02610787793416357032"
    },
    "jup": {
      "usd": "0.17465270066302526352"
    },
    "dusk": {
      "usd": "0.14794464162692689848"
    },
    "doge": {
      "usd": "0.09812961016633893672"
    },
    "bel": {
      "usd": "0.11023326238869063024"
    },
    "acm": {
      "usd": "0.4231276768640302776"
    },
    "juv": {
      "usd": "0.5071530311349015384"
    },
    "bome": {
      "usd": "0.0005361617843950832832"
    },
    "tia": {
      "usd": "0.39481913488943912664"
    },
    "ata": {
      "usd": "0.01090329001848210408"
    },
    "nmr": {
      "usd": "8.362523353624806432"
    },
    "loom": {
      "usd": "0.048324581724116554872"
    },
    "paxg": {
      "usd": "4777.421565364234811376"
    },
    "lit": {
      "usd": "0.7432242645625874616"
    },
    "woo": {
      "usd": "0.2120639893502941344"
    },
    "rei": {
      "usd": "0.004011210364597544712"
    },
    "rare": {
      "usd": "0.01560470865030466272"
    },
    "zec": {
      "usd": "323.367574704101815224"
    },
    "ren": {
      "usd": "0.042752900494488543888"
    },
    "atm": {
      "usd": "1.1043332275600222848"
    },
    "hbar": {
      "usd": "0.087686458992673508592"
    },
    "rep": {
      "usd": "4.731427686919298376"
    },
    "elf": {
      "usd": "0.22726857726597560064"
    },
    "pepe": {
      "usd": "0.000003721122831995727264"
    },
    "icx": {
      "usd": "0.0380114697892036656"
    },
    "req": {
      "usd": "0.11043332275600222848"
    },
    "xai": {
      "usd": "0.010613202485880286632"
    },
    "strax": {
      "usd": "0.013243996316027803488"
    },
    "chess": {
      "usd": "0.002810848160727955272"
    },
    "tusd": {
      "usd": "0.9993015347214332088"
    },
    "ctsi": {
      "usd": "0.033760186983832203"
    },
    "sxp": {
      "usd": "0.00220066404042758064"
    },
    "rvn": {
      "usd": "0.00585176574386424852"
    },
    "chr": {
      "usd": "0.018315526627376818872"
    },
    "fida": {
      "usd": "0.016164877678777137792"
    },
    "ntrn": {
      "usd": "0.00160048293849278592"
    },
    "sand": {
      "usd": "0.07872375453711390744"
    },
    "osmo": {
      "usd": "0.03280990023910211136"
    },
    "kava": {
      "usd": "0.055586773057527570984"
    },
    "ocean": {
      "usd": "0.61248481452445801176"
    },
    "vidt": {
      "usd": "0.00115034711204168988"
    },
    "adx": {
      "usd": "0.0795239960063603004"
    },
    "chz": {
      "usd": "0.040232139866362406064"
    },
    "xrp": {
      "usd": "2.13834523601001778824"
    },
    "c98": {
      "usd": "0.02110636875137361432"
    },
    "psg": {
      "usd": "0.835252033525922652"
    },
    "perp": {
      "usd": "0.1250377295697489"
    },
    "for": {
      "usd": "0.003060923619867453072"
    },
    "uma": {
      "usd": "0.4431337135951901016"
    },
    "syn": {
      "usd": "0.05141551439908074768"
    },
    "jasmy": {
      "usd": "0.00555167519289685116"
    },
    "sys": {
      "usd": "0.010433148155299848216"
    },
    "lunc": {
      "usd": "0.000042592852200639265296"
    },
    "luna": {
      "usd": "0.05681714431649390016"
    },
    "auction": {
      "usd": "4.681412595091398816"
    },
    "not": {
      "usd": "0.0003831156034017106296"
    },
    "gal": {
      "usd": "2.5427672685304136304"
    },
    "yfii": {
      "usd": "435.6314498210051676"
    },
    "alpha": {
      "usd": "0.00970292781461251464"
    },
    "tko": {
      "usd": "0.06291898551949764648"
    },
    "pixel": {
      "usd": "0.007612296976206313032"
    },
    "nexo": {
      "usd": "0.8892683327000541768"
    },
    "bico": {
      "usd": "0.0240072440773917888"
    },
    "troy": {
      "usd": "0.0000690208267225013928"
    },
    "mask": {
      "usd": "0.460138844816675952"
    },
    "enj": {
      "usd": "0.068260597326717319488"
    },
    "aave": {
      "usd": "92.908034579506222656"
    },
    "wan": {
      "usd": "0.055886863608494968344"
    },
    "gm": {
      "usd": "714.76567731251261196"
    },
    "oax": {
      "usd": "0.03581080574877608496"
    },
    "btxtest2": {
      "usd": "0.36891131732258715456"
    },
    "orn": {
      "usd": "1.0533178338955647336"
    },
    "ens": {
      "usd": "5.821756688767508784"
    },
    "pda": {
      "usd": "0.009772948943171574024"
    },
    "bond": {
      "usd": "2.1526495522727970624"
    },
    "tlm": {
      "usd": "0.0017925408911119202304"
    },
    "kp3r": {
      "usd": "16.484974266475694976"
    },
    "lqty": {
      "usd": "0.2890872307652594568"
    },
    "ckb": {
      "usd": "0.0015314621117702845272"
    },
    "bigtime": {
      "usd": "0.013073945003812944984"
    },
    "yfi": {
      "usd": "2665.804394427046548"
    },
    "xtz": {
      "usd": "0.3596085102425978364"
    },
    "dexe": {
      "usd": "14.8254735196259875752"
    },
    "meme": {
      "usd": "0.0005371620862316412744"
    },
    "dego": {
      "usd": "0.1610485956858365832"
    },
    "eos": {
      "usd": "0.78013540233157733688"
    },
    "alice": {
      "usd": "0.15834778072713000696"
    },
    "ooki": {
      "usd": "0.0001190359185504009528"
    },
    "rif": {
      "usd": "0.04311300915564942072"
    },
    "rune": {
      "usd": "0.4161255640081243392"
    },
    "hook": {
      "usd": "0.00780235432515233136"
    },
    "skl": {
      "usd": "0.006892079653884559368"
    },
    "alpaca": {
      "usd": "0.22446773212361322528"
    },
    "tom2": {
      "usd": "698.940902258165191176"
    },
    "gtc": {
      "usd": "0.1360410497718868032"
    },
    "tom3": {
      "usd": "698.870881129606131792"
    },
    "xec": {
      "usd": "0.000007022118892637098224"
    },
    "ygg": {
      "usd": "0.039041780680858396536"
    },
    "1inch": {
      "usd": "0.09372828208548377544"
    },
    "id": {
      "usd": "0.03130944748426512456"
    },
    "portal": {
      "usd": "0.01215366731417959308"
    },
    "zil": {
      "usd": "0.00395119225440406524"
    },
    "axs": {
      "usd": "1.0993317183772323288"
    },
    "btxtest": {
      "usd": "0.0940283726364511728"
    },
    "comp": {
      "usd": "24.90751573029398088"
    },
    "io": {
      "usd": "0.12143664295814013168"
    },
    "xvg": {
      "usd": "0.0036681068346581537304"
    },
    "iq": {
      "usd": "0.0011033329257234642936"
    },
    "pundix": {
      "usd": "0.14684430960671310816"
    },
    "unfi": {
      "usd": "1.3414047628242661992"
    },
    "cream": {
      "usd": "2.10063385677178152"
    },
    "forth": {
      "usd": "0.2370715352642439144"
    },
    "clv": {
      "usd": "0.029378864939708201544"
    },
    "powr": {
      "usd": "0.06471952882530203064"
    },
    "zk": {
      "usd": "0.015714741852326041752"
    },
    "ctxc": {
      "usd": "0.06341913643777664208"
    },
    "ghst": {
      "usd": "0.1080325983482630496"
    },
    "xvs": {
      "usd": "2.740827032168895888"
    },
    "slp": {
      "usd": "0.0006441943827433463328"
    },
    "hft": {
      "usd": "0.01530461809933726536"
    },
    "beamx": {
      "usd": "0.0019565903923074307872"
    },
    "idex": {
      "usd": "0.001990600654750402488"
    },
    "hive": {
      "usd": "0.0615185629483164588"
    },
    "kmd": {
      "usd": "0.01630491993589525656"
    },
    "city": {
      "usd": "0.6912085690615719192"
    },
    "steem": {
      "usd": "0.058437633291717845904"
    },
    "celr": {
      "usd": "0.0025517699850594355512"
    },
    "dot": {
      "usd": "7.3132067270754736632"
    },
    "celo": {
      "usd": "0.0827749769751737718"
    },
    "rdnt": {
      "usd": "0.003280990023910211136"
    },
    "ton": {
      "usd": "1.2873884636501346744"
    },
    "pros": {
      "usd": "0.03721122831995727264"
    },
    "prom": {
      "usd": "2.2816884891887779272"
    },
    "ftm": {
      "usd": "0.69961110448865904528"
    },
    "knc": {
      "usd": "0.13824171381231438384"
    },
    "mav": {
      "usd": "0.015624714687035822544"
    },
    "bifi": {
      "usd": "52.61587660295033712"
    },
    "ftt": {
      "usd": "0.29498901160095160488"
    },
    "rlc": {
      "usd": "0.4291294878833782248"
    },
    "pha": {
      "usd": "0.03110938711695352632"
    },
    "manta": {
      "usd": "0.064799552972226669936"
    },
    "phb": {
      "usd": "0.1390419552815607768"
    },
    "xaut": {
      "usd": "4776.181191086902902288"
    },
    "blz": {
      "usd": "0.05821756688767508784"
    },
    "lpt": {
      "usd": "2.0826284237137376784"
    },
    "gft": {
      "usd": "0.001960591599653662752"
    },
    "api3": {
      "usd": "0.34280343938842358424"
    },
    "voxel": {
      "usd": "0.0140042257118118768"
    },
    "waxp": {
      "usd": "0.006632001176379481656"
    },
    "mbl": {
      "usd": "0.00097529429064404142"
    },
    "snt": {
      "usd": "0.02720820995437736064"
    },
    "glmr": {
      "usd": "0.0145043766300908724"
    },
    "rose": {
      "usd": "0.010923296055213263904"
    },
    "snx": {
      "usd": "0.290087532601817448"
    },
    "atom": {
      "usd": "1.765532741524854468"
    },
    "fun": {
      "usd": "0.0005171560495004814504"
    },
    "arkm": {
      "usd": "0.1365412006901657988"
    },
    "magic": {
      "usd": "0.06341913643777664208"
    },
    "quick": {
      "usd": "0.011273401698008560824"
    },
    "data": {
      "usd": "0.000880265616171032256"
    },
    "cos": {
      "usd": "0.0011463459046954579152"
    },
    "usd": {
      "usd": "1"
    },
    "qkc": {
      "usd": "0.0031579528980135782184"
    },
    "pyr": {
      "usd": "0.2610787793416357032"
    },
    "dai": {
      "usd": "0"
    },
    "sol": {
      "usd": "85.935930778697023992"
    },
    "high": {
      "usd": "0.3260983987179051312"
    },
    "burger": {
      "usd": "0.01720519158879744864"
    },
    "lazio": {
      "usd": "0.6722028341669700864"
    },
    "dar": {
      "usd": "0.217135519661643149784"
    },
    "etc": {
      "usd": "8.35252033525922652"
    },
    "ogn": {
      "usd": "0.022226706808318564464"
    },
    "bnb": {
      "usd": "0"
    },
    "usdt": {
      "usd": "1.0003018365579912"
    },
    "eth": {
      "usd": "3303.976960114313773776"
    },
    "neo": {
      "usd": "2.8368560084784630432"
    },
    "lrc": {
      "usd": "0.018795671508924654648"
    },
    "ordi": {
      "usd": "26.798086201388584248"
    },
    "saga": {
      "usd": "0.019896003529138444968"
    },
    "usdn": {
      "usd": "1.0003018365579912"
    },
    "pengu": {
      "usd": "0.0071101454542542014496"
    },
    "lista": {
      "usd": "0.08922692382097281504"
    },
    "spell": {
      "usd": "0.00016274910880798516824"
    },
    "mtl": {
      "usd": "0.2930884381114914216"
    },
    "trb": {
      "usd": "19.135774133354371656"
    },
    "alt": {
      "usd": "0.007082137002830577696"
    },
    "bnt": {
      "usd": "0.30569224125212211072"
    },
    "oxt": {
      "usd": "0.01020307873289151024"
    },
    "lever": {
      "usd": "0.00017505282139764846"
    },
    "usdc": {
      "usd": "0.999791682621346624488"
    },
    "utk": {
      "usd": "0.00795239960063603004"
    },
    "bnx": {
      "usd": "1.78243784256268451928"
    },
    "aergo": {
      "usd": "0.0635191666214324412"
    },
    "ilv": {
      "usd": "4.511361282876540312"
    },
    "hifi": {
      "usd": "0.1270383332428648824"
    },
    "egld": {
      "usd": "4.10123752988776392"
    },
    "tru": {
      "usd": "0.00440132808085516128"
    },
    "alpine": {
      "usd": "0.4341309970661681808"
    },
    "amb": {
      "usd": "0.000320096587698557184"
    },
    "edu": {
      "usd": "0.04211270731909142952"
    },
    "nfp": {
      "usd": "0.014284310226048114336"
    },
    "ustc": {
      "usd": "0.005211572568467134152"
    },
    "trx": {
      "usd": "0.3336006624920900652"
    },
    "dash": {
      "usd": "34.170310736820979392"
    },
    "nuls": {
      "usd": "0.02580778738319617296"
    },
    "mdx": {
      "usd": "0.0345104133612506964"
    },
    "joe": {
      "usd": "0.0470141863182255864"
    },
    "pond": {
      "usd": "0.00240072440773917888"
    },
    "lina": {
      "usd": "0.0003371017189200430344"
    },
    "lsk": {
      "usd": "0.1280386350794228736"
    },
    "amp": {
      "usd": "0.0008712628996420103352"
    },
    "pendle": {
      "usd": "1.295390878342598604"
    },
    "dydx": {
      "usd": "0.15249601498326575844"
    },
    "busd": {
      "usd": "1.00060192710895859736"
    },
    "akro": {
      "usd": "0.0009812961016633893672"
    },
    "alcx": {
      "usd": "5.271590678660613624"
    },
    "qtum": {
      "usd": "0.90027165290219208"
    },
    "arpa": {
      "usd": "0.009822964034999473584"
    },
    "coti": {
      "usd": "0.014164274005661155392"
    },
    "dcr": {
      "usd": "20.276118227030481624"
    },
    "og": {
      "usd": "2.9738973600869078376"
    },
    "ethfi": {
      "usd": "0.4731427686919298376"
    },
    "flux": {
      "usd": "0.06271892515218604824"
    },
    "ltc": {
      "usd": "129.449060668969641192"
    },
    "win": {
      "usd": "0.000020436166520879760216"
    },
    "beta": {
      "usd": "0.000360108661160876832"
    },
    "om": {
      "usd": "0.06692019286572961128"
    },
    "fxs": {
      "usd": "0.8122450912850888544"
    },
    "pla": {
      "usd": "0.23477084104016053464"
    },
    "ant": {
      "usd": "7.4092357033850408184"
    },
    "vgx": {
      "usd": "0.0180054330580438416"
    },
    "lto": {
      "usd": "0.00380114697892036656"
    },
    "crv": {
      "usd": "0.22596818487845021208"
    },
    "aeur": {
      "usd": "1.1633510359169437656"
    },
    "movr": {
      "usd": "1.9765964290385906112"
    },
    "srm": {
      "usd": "0.244493774891504209104"
    },
    "badger": {
      "usd": "0.7622299994571892944"
    },
    "rpl": {
      "usd": "1.870564434363443544"
    },
    "super": {
      "usd": "0.11383434900029939856"
    },
    "aevo": {
      "usd": "0.02480748554663818176"
    },
    "pols": {
      "usd": "0.30799293547620549048"
    },
    "cyber": {
      "usd": "0.5171560495004814504"
    },
    "qnt": {
      "usd": "73.192085380948216104"
    },
    "ldo": {
      "usd": "0.37691373201505108416"
    },
    "bake": {
      "usd": "0.05191566531735974328"
    },
    "agix": {
      "usd": "0.61428535783026239592"
    },
    "xlm": {
      "usd": "0.16795067835808672248"
    },
    "stmx": {
      "usd": "0.004566377883887229828"
    },
    "front": {
      "usd": "0.880265616171032256"
    },
    "gala": {
      "usd": "0.003210968895351151752"
    },
    "rndr": {
      "usd": "7.032121911002678136"
    }
  },
  "ts": 1776593066712
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:26.772256" elapsed="0.000841"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:26.774766" level="INFO">${data} = {'uft': {'usd': '0.00890268634536612168'}, 'ksm': {'usd': '4.911482017499736792'}, 'vanry': {'usd': '0.005361617843950832832'}, 'pyth': {'usd': '0.04421334117586321104'}, 'bal': {'usd': '0.96729187595...</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-04-19T18:04:26.773281" elapsed="0.001531"/>
</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-04-19T18:04:26.774997" elapsed="0.000412"/>
</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-04-19T18:04:26.775613" elapsed="0.000246"/>
</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-04-19T18:04:26.776979" elapsed="0.000266"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-04-19T18:04:26.777731" 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-04-19T18:04:26.777392" elapsed="0.000374"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.778108" 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', '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-04-19T18:04:26.777894" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:26.778787" 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-04-19T18:04:26.778514" elapsed="0.000379">Dictionary does not contain key 'rates'.</status>
</kw>
<msg time="2026-04-19T18:04:26.779005" 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-04-19T18:04:26.778346" elapsed="0.000691"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:26.779688" 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-04-19T18:04:26.779365" elapsed="0.000402">Dictionary does not contain key 'base'.</status>
</kw>
<msg time="2026-04-19T18:04:26.779872" 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-04-19T18:04:26.779190" elapsed="0.000709"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:26.780350" 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-04-19T18:04:26.780185" elapsed="0.000220">Dictionary does not contain key 'timestamp'.</status>
</kw>
<msg time="2026-04-19T18:04:26.780498" 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-04-19T18:04:26.780036" elapsed="0.000490"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:26.780982" 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-04-19T18:04:26.780803" elapsed="0.000233">Dictionary does not contain key 'date'.</status>
</kw>
<msg time="2026-04-19T18:04:26.781125" 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-04-19T18:04:26.780649" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:26.781637" 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-04-19T18:04:26.781460" elapsed="0.000229">Dictionary does not contain key 'success'.</status>
</kw>
<msg time="2026-04-19T18:04:26.781775" 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-04-19T18:04:26.781323" elapsed="0.000477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.782059" 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-04-19T18:04:26.781927" elapsed="0.000175"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.782329" 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-04-19T18:04:26.782209" elapsed="0.000160"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.782598" 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-04-19T18:04:26.782480" elapsed="0.000161"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.782871" 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-04-19T18:04:26.782754" elapsed="0.000160"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.783137" 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-04-19T18:04:26.783015" elapsed="0.000163"/>
</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-04-19T18:04:26.783290" elapsed="0.000119"/>
</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-04-19T18:04:26.783527" elapsed="0.000105"/>
</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-04-19T18:04:26.783745" elapsed="0.000107"/>
</kw>
<arg>${data}</arg>
<doc>验证价格转换字典的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:26.776539" elapsed="0.007407"/>
</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-04-19T18:04:26.776018" elapsed="0.007986"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.784647" 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-04-19T18:04:26.784110" elapsed="0.000578"/>
</kw>
<doc>验证单一货币价格转换接口功能</doc>
<tag>spot</tag>
<status status="PASS" start="2026-04-19T18:04:26.408233" elapsed="0.376616"/>
</test>
<doc>货币价格转换接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:25.352470" elapsed="1.432778"/>
</suite>
<status status="PASS" start="2026-04-19T18:04:24.485989" elapsed="2.300493"/>
</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-04-19T18:04:26.792729" 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-04-19T18:04:26.792499" elapsed="0.000261"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.793217" 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-04-19T18:04:26.793074" elapsed="0.000201"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:26.792851" elapsed="0.000460"/>
</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-04-19T18:04:26.793450" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:26.793342" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:26.792828" elapsed="0.000697"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.794266" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:26.794128" elapsed="0.000191"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:26.794575" 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-04-19T18:04:26.794710" 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-04-19T18:04:26.794837" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:26.794964" 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-04-19T18:04:26.795089" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:26.794388" elapsed="0.000793"/>
</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-04-19T18:04:26.795382" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:26.795514" 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-04-19T18:04:26.795645" elapsed="0.000022"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:26.795772" 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-04-19T18:04:26.795893" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:26.796002" 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-04-19T18:04:26.796105" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:26.796218" 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-04-19T18:04:26.796319" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:26.795207" elapsed="0.001155"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.796678" 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-04-19T18:04:26.796469" elapsed="0.000246"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.797008" 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-04-19T18:04:26.796812" elapsed="0.000232"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.797332" 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-04-19T18:04:26.797141" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.797664" 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-04-19T18:04:26.797468" elapsed="0.000232"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.797995" 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-04-19T18:04:26.797799" elapsed="0.000231"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.798326" 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-04-19T18:04:26.798125" elapsed="0.000236"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.798667" 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-04-19T18:04:26.798460" elapsed="0.000242"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.799002" 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-04-19T18:04:26.798796" elapsed="0.000241"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.799339" 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-04-19T18:04:26.799134" elapsed="0.000239"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:26.796383" elapsed="0.003020"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:26.794370" elapsed="0.005054"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.799655" 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-04-19T18:04:26.799512" elapsed="0.000185"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:26.800079" 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-04-19T18:04:26.799799" elapsed="0.000447"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:26.793856" elapsed="0.006451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:26.800493" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:26.800405" elapsed="0.000129"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:26.792117" elapsed="0.008469"/>
</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-04-19T18:04:26.803475" 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-04-19T18:04:26.802854" elapsed="0.000649"/>
</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-04-19T18:04:26.804079" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:26.803642" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:26.803625" elapsed="0.000521"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:26.804184" elapsed="0.000024"/>
</return>
<msg time="2026-04-19T18:04:26.804348" 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-04-19T18:04:26.802021" elapsed="0.002348"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:27.613758" 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-04-19T18:04:27.614190" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/spot/market/public/ticker/24h 
 status=200, reason=OK 
 headers={'Date': 'Sun, 19 Apr 2026 10:04:27 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': '141.11.146.71', 'X-Trace-ID': '9dadde24cc219ce2e88eefbe415334f7', 'X-Transparent': '00-9dadde24cc219ce2e88eefbe415334f7-3790beb42775457f-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': '9eeb15cf6e94e694-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":1776593066352,"cv":"-1366.38","cr":"-0.0178","o":"76411.63","l":"74884.77","h":"76438.66","c":"75045.25","q":"585.321650","v":"44324672.881559"},{"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":"doge_usdt","t":1772787429314,"cv":"0.00000","cr":"0.0000","o":"0.09810","l":"0.09810","h":"0.09810","c":"0.09810","q":"10193","v":"999.93330"},{"s":"uni_usdt","t":1748397549795,"cv":null,"cr":null,"o":null,"l":null,"h":null,"c":null,"q":"0.0","v":"0.0"},{"s":"eth_usdt","t":1765335417379,"cv":"203.70","cr":"0.0656","o":"3101.70","l":"3090.80","h":"3388.03","c":"3305.40","q":"4672.402","v":"14594910.252319999"},{"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":"doge_usdc","t":1753092238970,"cv":"-0.00041","cr":"-0.0015","o":"0.26970","l":"0.26929","h":"0.26970","c":"0.26929","q":"120","v":"32.31480"},{"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":1776593061536,"cv":"0.0000","cr":"0.0000","o":"0.1799","l":"0.1799","h":"0.2766","c":"0.1799","q":"90606438.4","v":"16360822.18621"},{"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":1776593067487} 
 </msg>
<msg time="2026-04-19T18:04:27.614447" 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-04-19T18:04:27.614947" 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-04-19T18:04:26.804456" elapsed="0.810557"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.616879" 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-04-19T18:04:27.615656" elapsed="0.001395"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.618388" 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-04-19T18:04:27.617287" elapsed="0.001152"/>
</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-04-19T18:04:27.618634" elapsed="0.000269"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.620391" 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-04-19T18:04:27.619094" elapsed="0.001347"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.620935" 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": 1776593066352,
      "cv": "-1366.38",
      "cr": "-0.0178",
      "o": "76411.63",
      "l": "74884.77",
      "h": "76438.66",
      "c": "75045.25",
      "q": "585.321650",
      "v": "44324672.881559"
    },
    {
      "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": "doge_usdt",
      "t": 1772787429314,
      "cv": "0.00000",
      "cr": "0.0000",
      "o": "0.09810",
      "l": "0.09810",
      "h": "0.09810",
      "c": "0.09810",
      "q": "10193",
      "v": "999.93330"
    },
    {
      "s": "uni_usdt",
      "t": 1748397549795,
      "cv": null,
      "cr": null,
      "o": null,
      "l": null,
      "h": null,
      "c": null,
      "q": "0.0",
      "v": "0.0"
    },
    {
      "s": "eth_usdt",
      "t": 1765335417379,
      "cv": "203.70",
      "cr": "0.0656",
      "o": "3101.70",
      "l": "3090.80",
      "h": "3388.03",
      "c": "3305.40",
      "q": "4672.402",
      "v": "14594910.252319999"
    },
    {
      "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": "doge_usdc",
      "t": 1753092238970,
      "cv": "-0.00041",
      "cr": "-0.0015",
      "o": "0.26970",
      "l": "0.26929",
      "h": "0.26970",
      "c": "0.26929",
      "q": "120",
      "v": "32.31480"
    },
    {
      "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": 1776593061536,
      "cv": "0.0000",
      "cr": "0.0000",
      "o": "0.1799",
      "l": "0.1799",
      "h": "0.2766",
      "c": "0.1799",
      "q": "90606438.4",
      "v": "16360822.18621"
    },
    {
      "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": 1776593067487
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:27.620641" elapsed="0.000515"/>
</kw>
<doc>验证24小时行情接口基本功能获取24小时行情数据</doc>
<tag>market</tag>
<status status="PASS" start="2026-04-19T18:04:26.800653" elapsed="0.820773"/>
</test>
<doc>24小时行情</doc>
<status status="PASS" start="2026-04-19T18:04:26.788785" elapsed="0.833247"/>
</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-04-19T18:04:27.629760" 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-04-19T18:04:27.629524" elapsed="0.000268"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.630318" 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-04-19T18:04:27.630184" elapsed="0.000184"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:27.629932" 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-04-19T18:04:27.630552" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:27.630448" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:27.629883" elapsed="0.000750"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.631431" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:27.631312" elapsed="0.000161"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:27.631688" 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-04-19T18:04:27.631806" 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-04-19T18:04:27.631915" 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-04-19T18:04:27.632021" 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-04-19T18:04:27.632125" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:27.631538" elapsed="0.000653"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:27.632354" 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-04-19T18:04:27.632465" 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-04-19T18:04:27.632575" 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-04-19T18:04:27.632680" 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-04-19T18:04:27.632783" 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-04-19T18:04:27.632884" 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-04-19T18:04:27.632985" 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-04-19T18:04:27.633088" 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-04-19T18:04:27.633191" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:27.632223" elapsed="0.001015"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.633644" 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-04-19T18:04:27.633353" elapsed="0.000356"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.634104" 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-04-19T18:04:27.633854" elapsed="0.000294"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.634500" 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-04-19T18:04:27.634272" elapsed="0.000268"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.634872" 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-04-19T18:04:27.634654" elapsed="0.000256"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.635227" 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-04-19T18:04:27.635018" elapsed="0.000245"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.635940" 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-04-19T18:04:27.635436" elapsed="0.000577"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.636530" 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-04-19T18:04:27.636224" elapsed="0.000357"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.637080" 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-04-19T18:04:27.636798" elapsed="0.000329"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.637514" 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-04-19T18:04:27.637254" elapsed="0.000304"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:27.633265" elapsed="0.004333"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:27.631523" elapsed="0.006109"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.637941" 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-04-19T18:04:27.637746" elapsed="0.000249"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:27.638451" 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-04-19T18:04:27.638115" elapsed="0.000546"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:27.631039" elapsed="0.007707"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.638968" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:27.638868" elapsed="0.000145"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:27.629175" elapsed="0.009899"/>
</kw>
<test id="s1-s4-s2-s2-t1" name="获取市场深度数据" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.640702" 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-04-19T18:04:27.640450" elapsed="0.000284"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:27.642638" 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-04-19T18:04:27.641905" elapsed="0.000767"/>
</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-04-19T18:04:27.643425" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:27.642818" elapsed="0.000666"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:27.642795" elapsed="0.000712"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:27.643541" elapsed="0.000036"/>
</return>
<msg time="2026-04-19T18:04:27.643743" 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-04-19T18:04:27.640992" elapsed="0.002776"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:28.455494" 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-04-19T18:04:28.455904" 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': 'Sun, 19 Apr 2026 10:04:28 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': '141.11.146.71', 'X-Trace-ID': '536e13638c065946835f97e6b0c7488a', 'X-Transparent': '00-536e13638c065946835f97e6b0c7488a-ad136ba9438e6d1e-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': '9eeb15d54b06cb25-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"timestamp":1776593061357,"lastUpdateId":1772103711669,"bids":[["75045.24","3.247680"],["75045.23","3.222080"],["75045.21","2.051250"],["75045.19","0.405590"],["75045.17","0.552230"],["75045.16","22.885390"],["75045.14","17.395870"],["75045.13","20.563800"],["75045.12","2.817340"],["75045.11","2.114060"],["75045.08","0.320060"],["75045.05","0.678060"],["75044.98","2.138820"],["75044.94","1.828390"],["75044.87","0.417690"],["75044.84","2.397410"],["75044.76","0.229800"],["75044.75","0.184840"],["75044.66","3.865720"],["75044.65","1.121950"],["75044.43","0.697900"],["75044.40","0.477160"],["75044.37","0.416640"],["75044.31","0.197220"],["75044.29","0.610390"],["75044.26","3.021330"],["75044.24","0.670160"],["75044.22","3.502450"],["75044.01","2.501470"],["75043.93","0.195220"],["75043.86","0.472270"],["75043.71","0.610150"],["75043.68","2.327220"],["75043.42","0.283590"],["75043.38","0.614530"],["75043.33","0.601770"],["75043.21","0.890300"],["75043.08","5.094730"],["75043.07","6.636110"],["75043.02","0.885050"],["75042.91","0.701890"],["75042.88","0.566770"],["75042.71","1.657840"],["75042.66","4.021210"],["75042.58","2.167100"],["75042.46","2.270020"],["75042.38","0.851310"],["75042.37","3.054310"],["75042.35","5.679460"],["75042.11","6.044700"],["75042.09","2.402100"],["75041.78","0.633480"],["75041.54","0.439270"],["75041.39","0.664810"],["75041.18","0.562850"],["75041.07","1.493050"],["75040.97","3.802370"],["75040.92","0.453730"],["75040.67","2.138650"],["75040.66","0.702190"],["75040.45","3.351650"],["75040.38","1.374470"],["75040.22","0.669620"],["75039.98","2.638060"],["75039.88","0.574500"],["75039.50","0.611410"],["75039.38","0.832240"],["75039.21","2.636120"],["75039.10","0.728420"],["75039.03","0.339620"],["75038.97","0.120640"],["75038.89","0.923980"],["75038.16","0.369440"],["75038.00","8.233860"],["75037.91","1.479810"],["75037.79","1.663280"],["75037.60","0.769030"],["75037.36","0.403940"],["75037.32","3.615380"],["75037.21","2.121780"],["75037.05","0.763430"],["75037.02","0.665870"],["75036.54","0.264710"],["75036.47","2.030180"],["75036.18","4.184200"],["75035.92","0.210470"],["75035.88","3.657190"],["75035.76","3.939490"],["75035.73","0.559490"],["75035.68","0.439020"],["75035.45","2.645580"],["75035.26","2.759610"],["75034.91","3.487120"],["75034.59","0.404610"],["75034.33","0.798370"],["75034.10","2.347000"],["75033.86","7.000930"],["75033.81","1.958960"],["75033.34","0.375890"],["75033.10","0.829150"],["75033.06","2.072690"],["75032.80","0.341840"],["75032.47","0.477840"],["75032.33","0.573840"],["75032.09","5.358680"],["75031.86","4.444590"],["75031.73","0.793880"],["75031.29","0.290770"],["75031.17","0.664010"],["75031.01","2.994170"],["75030.79","3.559270"],["75030.58","0.552120"],["75030.08","0.752820"],["75029.24","1.416150"],["75029.16","0.438920"],["75029.03","3.987710"],["75028.99","0.481140"],["75028.53","0.748590"],["75028.01","0.398480"],["75027.99","2.136960"],["75027.97","1.527290"],["75027.93","1.340690"],["75027.75","0.541200"],["75027.72","4.555690"],["75027.36","1.676230"],["75027.09","0.761560"],["75026.34","0.746580"],["75025.88","1.051070"],["75025.25","0.765110"],["75025.18","1.239860"],["75025.17","1.552660"],["75025.11","1.716940"],["75025.08","3.077210"],["75024.80","5.199040"],["75024.47","0.454250"],["75024.13","2.070280"],["75023.82","0.347010"],["75023.68","0.256760"],["75023.62","0.524480"],["75023.53","7.230710"],["75023.38","2.267830"],["75023.08","0.490370"],["75022.83","2.270910"],["75022.68","0.647030"],["75022.49","0.609310"],["75022.23","2.145920"],["75022.01","0.897440"],["75021.71","5.030520"],["75021.68","0.491280"],["75021.67","5.320890"],["75021.66","7.310850"],["75021.04","0.569740"],["75020.48","2.549460"],["75020.40","0.585590"],["75020.16","2.122240"],["75019.96","0.159990"],["75019.86","0.479450"],["75019.70","0.547210"],["75018.73","6.262200"],["75018.14","0.465800"],["75017.91","0.223650"],["75017.85","5.145060"],["75017.02","2.210860"],["75016.82","5.063460"],["75015.94","0.519090"],["75015.73","1.844570"],["75015.63","0.193420"],["75015.50","0.497440"],["75015.27","2.288740"],["75015.14","0.778090"],["75015.08","1.850180"],["75014.82","2.450630"],["75014.75","0.819260"],["75014.47","3.432360"],["75014.46","0.829090"],["75014.05","0.483460"],["75013.67","0.391000"],["75012.96","2.767990"],["75012.72","0.656510"],["75012.40","0.925590"],["75012.29","3.933990"],["75012.13","0.604540"],["75011.79","1.464470"],["75011.78","0.444310"],["75009.49","0.541420"],["75009.15","1.231450"],["75008.80","0.494080"],["75008.63","0.458610"],["75008.61","0.371230"],["75008.58","0.267820"],["75008.51","0.528910"],["75008.24","3.772040"],["75006.79","7.884640"],["75005.73","0.607930"],["75004.48","4.521410"],["71874.70","3.919560"],["71874.66","1.574140"],["70940.15","0.402920"],["70940.04","5.567660"],["0.01","1111.000001"]],"asks":[["75045.25","2.806720"],["75045.26","4.047120"],["75045.28","0.794860"],["75045.30","3.386660"],["75045.31","0.617900"],["75045.34","26.358000"],["75045.37","3.067910"],["75045.39","25.590730"],["75045.40","23.616000"],["75045.41","0.286300"],["75045.44","6.483090"],["75045.46","0.510330"],["75045.53","0.375730"],["75045.57","3.392090"],["75045.61","2.648420"],["75045.73","2.607260"],["75045.80","0.290350"],["75045.81","1.839200"],["75045.88","0.445190"],["75045.99","3.951740"],["75046.00","5.408200"],["75046.01","0.464720"],["75046.09","2.245040"],["75046.14","1.496190"],["75046.31","0.469850"],["75046.40","0.331820"],["75046.43","0.402600"],["75046.52","3.504790"],["75046.70","0.137350"],["75046.75","6.010920"],["75046.80","0.593700"],["75046.99","6.676110"],["75047.20","1.119800"],["75047.29","0.596750"],["75047.33","1.907840"],["75047.43","7.850300"],["75047.50","0.508390"],["75047.57","0.493120"],["75047.61","3.803390"],["75047.66","4.691120"],["75047.68","0.271540"],["75047.72","0.737610"],["75048.20","4.815660"],["75048.24","3.183770"],["75048.41","0.641550"],["75048.46","0.555070"],["75048.47","4.722540"],["75048.63","0.523380"],["75048.72","3.707850"],["75048.75","0.415060"],["75048.94","2.656590"],["75048.95","1.023030"],["75049.14","0.686260"],["75049.31","6.187470"],["75049.56","5.339490"],["75049.65","0.451310"],["75049.81","0.706970"],["75049.97","0.569360"],["75050.01","1.425980"],["75050.04","0.230170"],["75050.24","1.245830"],["75050.28","0.270690"],["75052.64","3.992640"],["75052.65","4.609480"],["75052.71","0.516360"],["75052.73","0.710640"],["75052.75","2.108670"],["75052.81","2.770100"],["75052.97","3.494700"],["75053.03","2.293440"],["75053.24","0.779190"],["75053.36","4.930700"],["75053.44","0.369830"],["75053.47","0.456980"],["75053.55","0.494720"],["75053.63","0.202640"],["75053.75","0.314480"],["75054.00","2.364620"],["75054.06","3.001330"],["75054.11","1.183420"],["75054.22","0.583780"],["75054.33","3.503060"],["75054.42","0.541410"],["75054.53","0.626580"],["75054.56","0.481000"],["75054.70","3.660560"],["75054.97","2.091320"],["75055.02","0.477580"],["75055.21","0.302790"],["75055.29","0.692160"],["75055.38","3.488800"],["75055.71","0.211840"],["75055.94","0.730800"],["75056.32","0.432140"],["75057.19","0.247470"],["75057.35","2.673560"],["75057.52","1.028560"],["75057.63","2.016000"],["75057.72","0.500260"],["75058.03","0.384990"],["75058.29","0.218410"],["75058.64","3.786430"],["75059.59","0.313470"],["75059.65","0.622980"],["75059.84","0.205500"],["75060.66","0.655200"],["75061.04","1.484810"],["75061.19","2.799070"],["75061.46","0.630340"],["75061.78","0.588930"],["75061.79","0.178590"],["75062.05","0.800570"],["75062.58","3.212380"],["75062.75","3.265440"],["75062.76","0.439210"],["75062.78","0.807290"],["75062.80","0.746140"],["75062.81","2.874570"],["75062.83","0.543550"],["75062.87","3.013840"],["75062.91","0.555780"],["75062.92","0.802410"],["75062.98","1.471060"],["75063.09","1.592310"],["75063.28","0.697450"],["75063.73","0.466030"],["75064.38","1.663630"],["75065.04","6.459040"],["75065.30","6.120530"],["75065.49","2.480770"],["75065.57","0.788240"],["75065.70","0.969640"],["75065.71","0.745040"],["75065.98","3.037580"],["75066.08","0.757610"],["75066.13","0.417170"],["75066.17","2.507890"],["75066.41","2.235570"],["75066.52","3.097630"],["75066.80","0.706170"],["75067.21","2.592110"],["75067.34","0.555910"],["75067.42","2.142700"],["75067.80","6.735220"],["75068.83","0.594800"],["75069.71","0.441790"],["75069.96","3.373400"],["75072.28","2.231790"],["75072.70","0.213550"],["75072.74","3.361810"],["75072.76","0.521780"],["75072.85","0.672870"],["75072.88","0.945050"],["75072.94","0.537420"],["75072.95","3.371410"],["75073.36","4.698150"],["75073.43","0.403720"],["75073.50","1.316590"],["75073.81","3.823280"],["75073.91","0.260760"],["75074.52","7.027650"],["75074.62","0.274360"],["75074.70","3.104650"],["75074.81","5.971130"],["75074.96","0.620060"],["75075.03","0.197660"],["75075.06","0.258640"],["75075.46","0.479010"],["75075.89","1.743040"],["75076.01","0.314660"],["75076.17","0.286460"],["75076.18","0.591550"],["75077.19","0.341930"],["75077.78","5.016030"],["75078.08","0.620260"],["75079.19","0.474090"],["75080.94","3.746520"],["75081.74","1.884660"],["75082.04","2.857410"],["75082.06","0.596000"],["75082.11","0.757390"],["75082.26","4.265160"],["75082.48","3.651310"],["75082.55","0.890250"],["75082.60","3.035720"],["75082.62","0.462490"],["75082.75","0.284990"],["75083.03","0.733910"],["75083.09","0.529290"],["75083.67","5.838250"],["75084.31","2.227020"],["75084.34","0.698510"],["75086.12","0.917600"],["75086.16","0.459780"],["76032.44","0.549190"],["76070.21","3.638640"],["76070.22","3.405280"],["76070.27","2.045720"],["76070.37","0.839560"],["76070.40","3.566440"],["76070.46","0.684050"],["76881.47","2.848320"],["76881.48","3.541440"],["76881.49","1.098180"],["76881.52","4.799280"],["76881.54","0.729500"],["76881.55","4.512620"],["76881.57","0.731270"],["76881.58","6.641280"],["76881.66","0.432980"],["76881.68","1.467100"],["76881.69",... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-19T18:04:28.456470" 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-04-19T18:04:28.456855" 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-04-19T18:04:27.643868" elapsed="0.813051"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.459779" 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-04-19T18:04:28.457463" elapsed="0.002553"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.462616" level="INFO">${resp_json} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'timestamp': 1776593061357, 'lastUpdateId': 1772103711669, 'bids': [['75045.24', '3.247680'], ['75045.23', '3.222080'], ['75045.21', '2.051250'], ...</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-04-19T18:04:28.460462" elapsed="0.002226"/>
</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-04-19T18:04:28.462989" elapsed="0.000358"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.466780" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "timestamp": 1776593061357,
    "lastUpdateId": 1772103711669,
    "bids": [
      [
        "75045.24",
        "3.247680"
      ],...</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-04-19T18:04:28.463593" elapsed="0.003236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.467397" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "timestamp": 1776593061357,
    "lastUpdateId": 1772103711669,
    "bids": [
      [
        "75045.24",
        "3.247680"
      ],
      [
        "75045.23",
        "3.222080"
      ],
      [
        "75045.21",
        "2.051250"
      ],
      [
        "75045.19",
        "0.405590"
      ],
      [
        "75045.17",
        "0.552230"
      ],
      [
        "75045.16",
        "22.885390"
      ],
      [
        "75045.14",
        "17.395870"
      ],
      [
        "75045.13",
        "20.563800"
      ],
      [
        "75045.12",
        "2.817340"
      ],
      [
        "75045.11",
        "2.114060"
      ],
      [
        "75045.08",
        "0.320060"
      ],
      [
        "75045.05",
        "0.678060"
      ],
      [
        "75044.98",
        "2.138820"
      ],
      [
        "75044.94",
        "1.828390"
      ],
      [
        "75044.87",
        "0.417690"
      ],
      [
        "75044.84",
        "2.397410"
      ],
      [
        "75044.76",
        "0.229800"
      ],
      [
        "75044.75",
        "0.184840"
      ],
      [
        "75044.66",
        "3.865720"
      ],
      [
        "75044.65",
        "1.121950"
      ],
      [
        "75044.43",
        "0.697900"
      ],
      [
        "75044.40",
        "0.477160"
      ],
      [
        "75044.37",
        "0.416640"
      ],
      [
        "75044.31",
        "0.197220"
      ],
      [
        "75044.29",
        "0.610390"
      ],
      [
        "75044.26",
        "3.021330"
      ],
      [
        "75044.24",
        "0.670160"
      ],
      [
        "75044.22",
        "3.502450"
      ],
      [
        "75044.01",
        "2.501470"
      ],
      [
        "75043.93",
        "0.195220"
      ],
      [
        "75043.86",
        "0.472270"
      ],
      [
        "75043.71",
        "0.610150"
      ],
      [
        "75043.68",
        "2.327220"
      ],
      [
        "75043.42",
        "0.283590"
      ],
      [
        "75043.38",
        "0.614530"
      ],
      [
        "75043.33",
        "0.601770"
      ],
      [
        "75043.21",
        "0.890300"
      ],
      [
        "75043.08",
        "5.094730"
      ],
      [
        "75043.07",
        "6.636110"
      ],
      [
        "75043.02",
        "0.885050"
      ],
      [
        "75042.91",
        "0.701890"
      ],
      [
        "75042.88",
        "0.566770"
      ],
      [
        "75042.71",
        "1.657840"
      ],
      [
        "75042.66",
        "4.021210"
      ],
      [
        "75042.58",
        "2.167100"
      ],
      [
        "75042.46",
        "2.270020"
      ],
      [
        "75042.38",
        "0.851310"
      ],
      [
        "75042.37",
        "3.054310"
      ],
      [
        "75042.35",
        "5.679460"
      ],
      [
        "75042.11",
        "6.044700"
      ],
      [
        "75042.09",
        "2.402100"
      ],
      [
        "75041.78",
        "0.633480"
      ],
      [
        "75041.54",
        "0.439270"
      ],
      [
        "75041.39",
        "0.664810"
      ],
      [
        "75041.18",
        "0.562850"
      ],
      [
        "75041.07",
        "1.493050"
      ],
      [
        "75040.97",
        "3.802370"
      ],
      [
        "75040.92",
        "0.453730"
      ],
      [
        "75040.67",
        "2.138650"
      ],
      [
        "75040.66",
        "0.702190"
      ],
      [
        "75040.45",
        "3.351650"
      ],
      [
        "75040.38",
        "1.374470"
      ],
      [
        "75040.22",
        "0.669620"
      ],
      [
        "75039.98",
        "2.638060"
      ],
      [
        "75039.88",
        "0.574500"
      ],
      [
        "75039.50",
        "0.611410"
      ],
      [
        "75039.38",
        "0.832240"
      ],
      [
        "75039.21",
        "2.636120"
      ],
      [
        "75039.10",
        "0.728420"
      ],
      [
        "75039.03",
        "0.339620"
      ],
      [
        "75038.97",
        "0.120640"
      ],
      [
        "75038.89",
        "0.923980"
      ],
      [
        "75038.16",
        "0.369440"
      ],
      [
        "75038.00",
        "8.233860"
      ],
      [
        "75037.91",
        "1.479810"
      ],
      [
        "75037.79",
        "1.663280"
      ],
      [
        "75037.60",
        "0.769030"
      ],
      [
        "75037.36",
        "0.403940"
      ],
      [
        "75037.32",
        "3.615380"
      ],
      [
        "75037.21",
        "2.121780"
      ],
      [
        "75037.05",
        "0.763430"
      ],
      [
        "75037.02",
        "0.665870"
      ],
      [
        "75036.54",
        "0.264710"
      ],
      [
        "75036.47",
        "2.030180"
      ],
      [
        "75036.18",
        "4.184200"
      ],
      [
        "75035.92",
        "0.210470"
      ],
      [
        "75035.88",
        "3.657190"
      ],
      [
        "75035.76",
        "3.939490"
      ],
      [
        "75035.73",
        "0.559490"
      ],
      [
        "75035.68",
        "0.439020"
      ],
      [
        "75035.45",
        "2.645580"
      ],
      [
        "75035.26",
        "2.759610"
      ],
      [
        "75034.91",
        "3.487120"
      ],
      [
        "75034.59",
        "0.404610"
      ],
      [
        "75034.33",
        "0.798370"
      ],
      [
        "75034.10",
        "2.347000"
      ],
      [
        "75033.86",
        "7.000930"
      ],
      [
        "75033.81",
        "1.958960"
      ],
      [
        "75033.34",
        "0.375890"
      ],
      [
        "75033.10",
        "0.829150"
      ],
      [
        "75033.06",
        "2.072690"
      ],
      [
        "75032.80",
        "0.341840"
      ],
      [
        "75032.47",
        "0.477840"
      ],
      [
        "75032.33",
        "0.573840"
      ],
      [
        "75032.09",
        "5.358680"
      ],
      [
        "75031.86",
        "4.444590"
      ],
      [
        "75031.73",
        "0.793880"
      ],
      [
        "75031.29",
        "0.290770"
      ],
      [
        "75031.17",
        "0.664010"
      ],
      [
        "75031.01",
        "2.994170"
      ],
      [
        "75030.79",
        "3.559270"
      ],
      [
        "75030.58",
        "0.552120"
      ],
      [
        "75030.08",
        "0.752820"
      ],
      [
        "75029.24",
        "1.416150"
      ],
      [
        "75029.16",
        "0.438920"
      ],
      [
        "75029.03",
        "3.987710"
      ],
      [
        "75028.99",
        "0.481140"
      ],
      [
        "75028.53",
        "0.748590"
      ],
      [
        "75028.01",
        "0.398480"
      ],
      [
        "75027.99",
        "2.136960"
      ],
      [
        "75027.97",
        "1.527290"
      ],
      [
        "75027.93",
        "1.340690"
      ],
      [
        "75027.75",
        "0.541200"
      ],
      [
        "75027.72",
        "4.555690"
      ],
      [
        "75027.36",
        "1.676230"
      ],
      [
        "75027.09",
        "0.761560"
      ],
      [
        "75026.34",
        "0.746580"
      ],
      [
        "75025.88",
        "1.051070"
      ],
      [
        "75025.25",
        "0.765110"
      ],
      [
        "75025.18",
        "1.239860"
      ],
      [
        "75025.17",
        "1.552660"
      ],
      [
        "75025.11",
        "1.716940"
      ],
      [
        "75025.08",
        "3.077210"
      ],
      [
        "75024.80",
        "5.199040"
      ],
      [
        "75024.47",
        "0.454250"
      ],
      [
        "75024.13",
        "2.070280"
      ],
      [
        "75023.82",
        "0.347010"
      ],
      [
        "75023.68",
        "0.256760"
      ],
      [
        "75023.62",
        "0.524480"
      ],
      [
        "75023.53",
        "7.230710"
      ],
      [
        "75023.38",
        "2.267830"
      ],
      [
        "75023.08",
        "0.490370"
      ],
      [
        "75022.83",
        "2.270910"
      ],
      [
        "75022.68",
        "0.647030"
      ],
      [
        "75022.49",
        "0.609310"
      ],
      [
        "75022.23",
        "2.145920"
      ],
      [
        "75022.01",
        "0.897440"
      ],
      [
        "75021.71",
        "5.030520"
      ],
      [
        "75021.68",
        "0.491280"
      ],
      [
        "75021.67",
        "5.320890"
      ],
      [
        "75021.66",
        "7.310850"
      ],
      [
        "75021.04",
        "0.569740"
      ],
      [
        "75020.48",
        "2.549460"
      ],
      [
        "75020.40",
        "0.585590"
      ],
      [
        "75020.16",
        "2.122240"
      ],
      [
        "75019.96",
        "0.159990"
      ],
      [
        "75019.86",
        "0.479450"
      ],
      [
        "75019.70",
        "0.547210"
      ],
      [
        "75018.73",
        "6.262200"
      ],
      [
        "75018.14",
        "0.465800"
      ],
      [
        "75017.91",
        "0.223650"
      ],
      [
        "75017.85",
        "5.145060"
      ],
      [
        "75017.02",
        "2.210860"
      ],
      [
        "75016.82",
        "5.063460"
      ],
      [
        "75015.94",
        "0.519090"
      ],
      [
        "75015.73",
        "1.844570"
      ],
      [
        "75015.63",
        "0.193420"
      ],
      [
        "75015.50",
        "0.497440"
      ],
      [
        "75015.27",
        "2.288740"
      ],
      [
        "75015.14",
        "0.778090"
      ],
      [
        "75015.08",
        "1.850180"
      ],
      [
        "75014.82",
        "2.450630"
      ],
      [
        "75014.75",
        "0.819260"
      ],
      [
        "75014.47",
        "3.432360"
      ],
      [
        "75014.46",
        "0.829090"
      ],
      [
        "75014.05",
        "0.483460"
      ],
      [
        "75013.67",
        "0.391000"
      ],
      [
        "75012.96",
        "2.767990"
      ],
      [
        "75012.72",
        "0.656510"
      ],
      [
        "75012.40",
        "0.925590"
      ],
      [
        "75012.29",
        "3.933990"
      ],
      [
        "75012.13",
        "0.604540"
      ],
      [
        "75011.79",
        "1.464470"
      ],
      [
        "75011.78",
        "0.444310"
      ],
      [
        "75009.49",
        "0.541420"
      ],
      [
        "75009.15",
        "1.231450"
      ],
      [
        "75008.80",
        "0.494080"
      ],
      [
        "75008.63",
        "0.458610"
      ],
      [
        "75008.61",
        "0.371230"
      ],
      [
        "75008.58",
        "0.267820"
      ],
      [
        "75008.51",
        "0.528910"
      ],
      [
        "75008.24",
        "3.772040"
      ],
      [
        "75006.79",
        "7.884640"
      ],
      [
        "75005.73",
        "0.607930"
      ],
      [
        "75004.48",
        "4.521410"
      ],
      [
        "71874.70",
        "3.919560"
      ],
      [
        "71874.66",
        "1.574140"
      ],
      [
        "70940.15",
        "0.402920"
      ],
      [
        "70940.04",
        "5.567660"
      ],
      [
        "0.01",
        "1111.000001"
      ]
    ],
    "asks": [
      [
        "75045.25",
        "2.806720"
      ],
      [
        "75045.26",
        "4.047120"
      ],
      [
        "75045.28",
        "0.794860"
      ],
      [
        "75045.30",
        "3.386660"
      ],
      [
        "75045.31",
        "0.617900"
      ],
      [
        "75045.34",
        "26.358000"
      ],
      [
        "75045.37",
        "3.067910"
      ],
      [
        "75045.39",
        "25.590730"
      ],
      [
        "75045.40",
        "23.616000"
      ],
      [
        "75045.41",
        "0.286300"
      ],
      [
        "75045.44",
        "6.483090"
      ],
      [
        "75045.46",
        "0.510330"
      ],
      [
        "75045.53",
        "0.375730"
      ],
      [
        "75045.57",
        "3.392090"
      ],
      [
        "75045.61",
        "2.648420"
      ],
      [
        "75045.73",
        "2.607260"
      ],
      [
        "75045.80",
        "0.290350"
      ],
      [
        "75045.81",
        "1.839200"
      ],
      [
        "75045.88",
        "0.445190"
      ],
      [
        "75045.99",
        "3.951740"
      ],
      [
        "75046.00",
        "5.408200"
      ],
      [
        "75046.01",
        "0.464720"
      ],
      [
        "75046.09",
        "2.245040"
      ],
      [
        "75046.14",
        "1.496190"
      ],
      [
        "75046.31",
        "0.469850"
      ],
      [
        "75046.40",
        "0.331820"
      ],
      [
        "75046.43",
        "0.402600"
      ],
      [
        "75046.52",
        "3.504790"
      ],
      [
        "75046.70",
        "0.137350"
      ],
      [
        "75046.75",
        "6.010920"
      ],
      [
        "75046.80",
        "0.593700"
      ],
      [
        "75046.99",
        "6.676110"
      ],
      [
        "75047.20",
        "1.119800"
      ],
      [
        "75047.29",
        "0.596750"
      ],
      [
        "75047.33",
        "1.907840"
      ],
      [
        "75047.43",
        "7.850300"
      ],
      [
        "75047.50",
        "0.508390"
      ],
      [
        "75047.57",
        "0.493120"
      ],
      [
        "75047.61",
        "3.803390"
      ],
      [
        "75047.66",
        "4.691120"
      ],
      [
        "75047.68",
        "0.271540"
      ],
      [
        "75047.72",
        "0.737610"
      ],
      [
        "75048.20",
        "4.815660"
      ],
      [
        "75048.24",
        "3.183770"
      ],
      [
        "75048.41",
        "0.641550"
      ],
      [
        "75048.46",
        "0.555070"
      ],
      [
        "75048.47",
        "4.722540"
      ],
      [
        "75048.63",
        "0.523380"
      ],
      [
        "75048.72",
        "3.707850"
      ],
      [
        "75048.75",
        "0.415060"
      ],
      [
        "75048.94",
        "2.656590"
      ],
      [
        "75048.95",
        "1.023030"
      ],
      [
        "75049.14",
        "0.686260"
      ],
      [
        "75049.31",
        "6.187470"
      ],
      [
        "75049.56",
        "5.339490"
      ],
      [
        "75049.65",
        "0.451310"
      ],
      [
        "75049.81",
        "0.706970"
      ],
      [
        "75049.97",
        "0.569360"
      ],
      [
        "75050.01",
        "1.425980"
      ],
      [
        "75050.04",
        "0.230170"
      ],
      [
        "75050.24",
        "1.245830"
      ],
      [
        "75050.28",
        "0.270690"
      ],
      [
        "75052.64",
        "3.992640"
      ],
      [
        "75052.65",
        "4.609480"
      ],
      [
        "75052.71",
        "0.516360"
      ],
      [
        "75052.73",
        "0.710640"
      ],
      [
        "75052.75",
        "2.108670"
      ],
      [
        "75052.81",
        "2.770100"
      ],
      [
        "75052.97",
        "3.494700"
      ],
      [
        "75053.03",
        "2.293440"
      ],
      [
        "75053.24",
        "0.779190"
      ],
      [
        "75053.36",
        "4.930700"
      ],
      [
        "75053.44",
        "0.369830"
      ],
      [
        "75053.47",
        "0.456980"
      ],
      [
        "75053.55",
        "0.494720"
      ],
      [
        "75053.63",
        "0.202640"
      ],
      [
        "75053.75",
        "0.314480"
      ],
      [
        "75054.00",
        "2.364620"
      ],
      [
        "75054.06",
        "3.001330"
      ],
      [
        "75054.11",
        "1.183420"
      ],
      [
        "75054.22",
        "0.583780"
      ],
      [
        "75054.33",
        "3.503060"
      ],
      [
        "75054.42",
        "0.541410"
      ],
      [
        "75054.53",
        "0.626580"
      ],
      [
        "75054.56",
        "0.481000"
      ],
      [
        "75054.70",
        "3.660560"
      ],
      [
        "75054.97",
        "2.091320"
      ],
      [
        "75055.02",
        "0.477580"
      ],
      [
        "75055.21",
        "0.302790"
      ],
      [
        "75055.29",
        "0.692160"
      ],
      [
        "75055.38",
        "3.488800"
      ],
      [
        "75055.71",
        "0.211840"
      ],
      [
        "75055.94",
        "0.730800"
      ],
      [
        "75056.32",
        "0.432140"
      ],
      [
        "75057.19",
        "0.247470"
      ],
      [
        "75057.35",
        "2.673560"
      ],
      [
        "75057.52",
        "1.028560"
      ],
      [
        "75057.63",
        "2.016000"
      ],
      [
        "75057.72",
        "0.500260"
      ],
      [
        "75058.03",
        "0.384990"
      ],
      [
        "75058.29",
        "0.218410"
      ],
      [
        "75058.64",
        "3.786430"
      ],
      [
        "75059.59",
        "0.313470"
      ],
      [
        "75059.65",
        "0.622980"
      ],
      [
        "75059.84",
        "0.205500"
      ],
      [
        "75060.66",
        "0.655200"
      ],
      [
        "75061.04",
        "1.484810"
      ],
      [
        "75061.19",
        "2.799070"
      ],
      [
        "75061.46",
        "0.630340"
      ],
      [
        "75061.78",
        "0.588930"
      ],
      [
        "75061.79",
        "0.178590"
      ],
      [
        "75062.05",
        "0.800570"
      ],
      [
        "75062.58",
        "3.212380"
      ],
      [
        "75062.75",
        "3.265440"
      ],
      [
        "75062.76",
        "0.439210"
      ],
      [
        "75062.78",
        "0.807290"
      ],
      [
        "75062.80",
        "0.746140"
      ],
      [
        "75062.81",
        "2.874570"
      ],
      [
        "75062.83",
        "0.543550"
      ],
      [
        "75062.87",
        "3.013840"
      ],
      [
        "75062.91",
        "0.555780"
      ],
      [
        "75062.92",
        "0.802410"
      ],
      [
        "75062.98",
        "1.471060"
      ],
      [
        "75063.09",
        "1.592310"
      ],
      [
        "75063.28",
        "0.697450"
      ],
      [
        "75063.73",
        "0.466030"
      ],
      [
        "75064.38",
        "1.663630"
      ],
      [
        "75065.04",
        "6.459040"
      ],
      [
        "75065.30",
        "6.120530"
      ],
      [
        "75065.49",
        "2.480770"
      ],
      [
        "75065.57",
        "0.788240"
      ],
      [
        "75065.70",
        "0.969640"
      ],
      [
        "75065.71",
        "0.745040"
      ],
      [
        "75065.98",
        "3.037580"
      ],
      [
        "75066.08",
        "0.757610"
      ],
      [
        "75066.13",
        "0.417170"
      ],
      [
        "75066.17",
        "2.507890"
      ],
      [
        "75066.41",
        "2.235570"
      ],
      [
        "75066.52",
        "3.097630"
      ],
      [
        "75066.80",
        "0.706170"
      ],
      [
        "75067.21",
        "2.592110"
      ],
      [
        "75067.34",
        "0.555910"
      ],
      [
        "75067.42",
        "2.142700"
      ],
      [
        "75067.80",
        "6.735220"
      ],
      [
        "75068.83",
        "0.594800"
      ],
      [
        "75069.71",
        "0.441790"
      ],
      [
        "75069.96",
        "3.373400"
      ],
      [
        "75072.28",
        "2.231790"
      ],
      [
        "75072.70",
        "0.213550"
      ],
      [
        "75072.74",
        "3.361810"
      ],
      [
        "75072.76",
        "0.521780"
      ],
      [
        "75072.85",
        "0.672870"
      ],
      [
        "75072.88",
        "0.945050"
      ],
      [
        "75072.94",
        "0.537420"
      ],
      [
        "75072.95",
        "3.371410"
      ],
      [
        "75073.36",
        "4.698150"
      ],
      [
        "75073.43",
        "0.403720"
      ],
      [
        "75073.50",
        "1.316590"
      ],
      [
        "75073.81",
        "3.823280"
      ],
      [
        "75073.91",
        "0.260760"
      ],
      [
        "75074.52",
        "7.027650"
      ],
      [
        "75074.62",
        "0.274360"
      ],
      [
        "75074.70",
        "3.104650"
      ],
      [
        "75074.81",
        "5.971130"
      ],
      [
        "75074.96",
        "0.620060"
      ],
      [
        "75075.03",
        "0.197660"
      ],
      [
        "75075.06",
        "0.258640"
      ],
      [
        "75075.46",
        "0.479010"
      ],
      [
        "75075.89",
        "1.743040"
      ],
      [
        "75076.01",
        "0.314660"
      ],
      [
        "75076.17",
        "0.286460"
      ],
      [
        "75076.18",
        "0.591550"
      ],
      [
        "75077.19",
        "0.341930"
      ],
      [
        "75077.78",
        "5.016030"
      ],
      [
        "75078.08",
        "0.620260"
      ],
      [
        "75079.19",
        "0.474090"
      ],
      [
        "75080.94",
        "3.746520"
      ],
      [
        "75081.74",
        "1.884660"
      ],
      [
        "75082.04",
        "2.857410"
      ],
      [
        "75082.06",
        "0.596000"
      ],
      [
        "75082.11",
        "0.757390"
      ],
      [
        "75082.26",
        "4.265160"
      ],
      [
        "75082.48",
        "3.651310"
      ],
      [
        "75082.55",
        "0.890250"
      ],
      [
        "75082.60",
        "3.035720"
      ],
      [
        "75082.62",
        "0.462490"
      ],
      [
        "75082.75",
        "0.284990"
      ],
      [
        "75083.03",
        "0.733910"
      ],
      [
        "75083.09",
        "0.529290"
      ],
      [
        "75083.67",
        "5.838250"
      ],
      [
        "75084.31",
        "2.227020"
      ],
      [
        "75084.34",
        "0.698510"
      ],
      [
        "75086.12",
        "0.917600"
      ],
      [
        "75086.16",
        "0.459780"
      ],
      [
        "76032.44",
        "0.549190"
      ],
      [
        "76070.21",
        "3.638640"
      ],
      [
        "76070.22",
        "3.405280"
      ],
      [
        "76070.27",
        "2.045720"
      ],
      [
        "76070.37",
        "0.839560"
      ],
      [
        "76070.40",
        "3.566440"
      ],
      [
        "76070.46",
        "0.684050"
      ],
      [
        "76881.47",
        "2.848320"
      ],
      [
        "76881.48",
        "3.541440"
      ],
      [
        "76881.49",
        "1.098180"
      ],
      [
        "76881.52",
        "4.799280"
      ],
      [
        "76881.54",
        "0.729500"
      ],
      [
        "76881.55",
        "4.512620"
      ],
      [
        "76881.57",
        "0.731270"
      ],
      [
        "76881.58",
        "6.641280"
      ],
      [
        "76881.66",
        "0.432980"
      ],
      [
        "76881.68",
        "1.467100"
      ],
      [
        "76881.69",
        "6.609750"
      ],
      [
        "76881.73",
        "3.196880"
      ],
      [
        "76881.83",
        "0.276820"
      ],
      [
        "76881.85",
        "2.602660"
      ],
      [
        "76881.90",
        "2.400760"
      ],
      [
        "76881.97",
        "3.953460"
      ],
      [
        "76881.98",
        "4.551580"
      ],
      [
        "76882.02",
        "0.556820"
      ],
      [
        "76882.24",
        "0.567500"
      ],
      [
        "76882.32",
        "0.305600"
      ],
      [
        "76882.37",
        "0.518130"
      ],
      [
        "76882.44",
        "0.677310"
      ],
      [
        "76882.49",
        "0.252440"
      ],
      [
        "76882.54",
        "3.860960"
      ],
      [
        "76882.61",
        "0.774280"
      ],
      [
        "76882.70",
        "0.609680"
      ],
      [
        "76882.73",
        "0.161150"
      ],
      [
        "76882.79",
        "0.553260"
      ],
      [
        "76882.83",
        "0.463740"
      ],
      [
        "76882.92",
        "2.781430"
      ],
      [
        "76883.11",
        "3.577340"
      ],
      [
        "76883.21",
        "0.908110"
      ],
      [
        "76883.39",
        "0.536760"
      ],
      [
        "76883.47",
        "0.907850"
      ],
      [
        "76883.55",
        "3.135940"
      ],
      [
        "76883.67",
        "0.779840"
      ],
      [
        "76883.84",
        "3.774490"
      ],
      [
        "76883.87",
        "1.517320"
      ],
      [
        "76883.94",
        "0.586810"
      ],
      [
        "76883.97",
        "0.418330"
      ],
      [
        "76884.01",
        "3.664430"
      ],
      [
        "76884.07",
        "5.222730"
      ],
      [
        "76884.31",
        "1.263960"
      ],
      [
        "76884.34",
        "3.811650"
      ],
      [
        "76884.36",
        "2.602550"
      ],
      [
        "76884.46",
        "0.211360"
      ],
      [
        "76884.48",
        "0.258000"
      ],
      [
        "76884.50",
        "2.895320"
      ],
      [
        "76884.56",
        "1.678720"
      ],
      [
        "76884.65",
        "0.590800"
      ],
      [
        "76884.66",
        "1.875890"
      ],
      [
        "76884.74",
        "1.038550"
      ],
      [
        "76885.44",
        "0.873750"
      ],
      [
        "76885.74",
        "1.400250"
      ],
      [
        "76885.80",
        "0.679410"
      ],
      [
        "76885.95",
        "1.462040"
      ],
      [
        "76886.04",
        "3.321330"
      ],
      [
        "76886.25",
        "4.814540"
      ],
      [
        "76886.45",
        "0.632180"
      ],
      [
        "76886.48",
        "1.432270"
      ],
      [
        "76886.53",
        "1.051470"
      ],
      [
        "76886.82",
        "0.393810"
      ],
      [
        "76887.23",
        "3.722680"
      ],
      [
        "76887.39",
        "0.448850"
      ],
      [
        "76887.57",
        "0.681100"
      ],
      [
        "76887.60",
        "0.541550"
      ],
      [
        "76887.66",
        "4.532290"
      ],
      [
        "76888.08",
        "0.650270"
      ],
      [
        "76888.66",
        "4.559320"
      ],
      [
        "76888.74",
        "2.625920"
      ],
      [
        "76888.77",
        "3.699000"
      ],
      [
        "76888.83",
        "0.662550"
      ],
      [
        "76888.93",
        "0.925830"
      ],
      [
        "76889.26",
        "0.374780"
      ],
      [
        "76889.40",
        "3.708740"
      ],
      [
        "76889.45",
        "0.304910"
      ],
      [
        "76889.48",
        "1.340170"
      ],
      [
        "76889.52",
        "7.257940"
      ],
      [
        "76889.89",
        "4.952300"
      ],
      [
        "76889.99",
        "3.334410"
      ],
      [
        "76890.03",
        "0.796020"
      ],
      [
        "76890.15",
        "0.626660"
      ],
      [
        "76890.32",
        "0.411230"
      ],
      [
        "76890.41",
        "0.553530"
      ],
      [
        "76890.51",
        "3.668320"
      ],
      [
        "76890.84",
        "5.257510"
      ],
      [
        "76891.05",
        "0.582330"
      ],
      [
        "76891.45",
        "1.338920"
      ],
      [
        "76891.53",
        "2.435250"
      ],
      [
        "76891.54",
        "0.179630"
      ]
    ]
  },
  "ts": 1776593068419
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:28.467029" elapsed="0.000975"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:28.469596" level="INFO">${data} = {'timestamp': 1776593061357, 'lastUpdateId': 1772103711669, 'bids': [['75045.24', '3.247680'], ['75045.23', '3.222080'], ['75045.21', '2.051250'], ['75045.19', '0.405590'], ['75045.17', '0.552230'], [...</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-04-19T18:04:28.468185" elapsed="0.001446"/>
</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-04-19T18:04:28.469783" elapsed="0.000342"/>
</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-04-19T18:04:28.470295" elapsed="0.000207"/>
</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-04-19T18:04:28.471561" elapsed="0.000248"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-04-19T18:04:28.472142" 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-04-19T18:04:28.471947" elapsed="0.000228"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.472456" 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-04-19T18:04:28.472301" elapsed="0.000205"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${depth_dict}</arg>
<arg>bids</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-04-19T18:04:28.472799" elapsed="0.000171"/>
</kw>
<msg time="2026-04-19T18:04:28.473071" 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-04-19T18:04:28.472638" elapsed="0.000461"/>
</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-04-19T18:04:28.473352" elapsed="0.000136"/>
</kw>
<msg time="2026-04-19T18:04:28.473572" 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-04-19T18:04:28.473221" elapsed="0.000375"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:28.474070" 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-04-19T18:04:28.473850" elapsed="0.000328">Dictionary does not contain key 'symbol'.</status>
</kw>
<msg time="2026-04-19T18:04:28.474270" 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-04-19T18:04:28.473712" elapsed="0.000582"/>
</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-04-19T18:04:28.474684" elapsed="0.000135"/>
</kw>
<msg time="2026-04-19T18:04:28.474901" 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-04-19T18:04:28.474411" elapsed="0.000514"/>
</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-04-19T18:04:28.475167" elapsed="0.000146"/>
</kw>
<msg time="2026-04-19T18:04:28.475400" 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-04-19T18:04:28.475040" elapsed="0.000383"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.475661" 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-04-19T18:04:28.475537" elapsed="0.000166"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.475917" 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-04-19T18:04:28.475805" elapsed="0.000152"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.476170" 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-04-19T18:04:28.476057" elapsed="0.000153"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.476426" 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-04-19T18:04:28.476309" elapsed="0.000159"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.476686" 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-04-19T18:04:28.476570" elapsed="0.000157"/>
</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-04-19T18:04:28.477691" elapsed="0.000207"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.478103" level="INFO">Length is 200.</msg>
<msg time="2026-04-19T18:04:28.478172" 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-04-19T18:04:28.478003" elapsed="0.000190"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.478461" level="INFO">买盘数据包含 200 个价位</msg>
<arg>买盘数据包含 ${bids_length} 个价位</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:28.478353" elapsed="0.000145"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="验证价格层级数据">
<kw name="Should Be True" owner="BuiltIn">
<arg>isinstance($price_level, list)</arg>
<arg>${side}数据应该是列表格式</arg>
<doc>Fails if the given condition is not true.</doc>
<status status="PASS" start="2026-04-19T18:04:28.479626" elapsed="0.000266"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.480109" level="INFO">Length is 2.</msg>
<msg time="2026-04-19T18:04:28.480197" 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-04-19T18:04:28.479996" elapsed="0.000225"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.480461" level="INFO">买盘数据包含 2 个元素</msg>
<arg>${side}数据包含 ${level_length} 个元素</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:28.480328" elapsed="0.000172"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.481597" level="INFO">买盘价格: 75045.24, 数量: 3.247680</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-04-19T18:04:28.480789" elapsed="0.000847"/>
</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-04-19T18:04:28.480601" elapsed="0.001078"/>
</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-04-19T18:04:28.481938" elapsed="0.000253"/>
</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-04-19T18:04:28.481779" elapsed="0.000458"/>
</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-04-19T18:04:28.482478" elapsed="0.000194"/>
</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-04-19T18:04:28.482332" elapsed="0.000383"/>
</kw>
<arg>${bids[0]}</arg>
<arg>买盘</arg>
<doc>验证单个价格层级数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:28.478867" elapsed="0.003912"/>
</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-04-19T18:04:28.478595" elapsed="0.004231"/>
</kw>
<arg>${depth_dict['bids']}</arg>
<doc>验证买盘数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:28.477066" elapsed="0.005813"/>
</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-04-19T18:04:28.476833" elapsed="0.006090"/>
</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-04-19T18:04:28.483795" elapsed="0.000177"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.484150" level="INFO">Length is 291.</msg>
<msg time="2026-04-19T18:04:28.484211" level="INFO">${asks_length} = 291</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-04-19T18:04:28.484066" elapsed="0.000163"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.484405" level="INFO">卖盘数据包含 291 个价位</msg>
<arg>卖盘数据包含 ${asks_length} 个价位</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:28.484313" elapsed="0.000127"/>
</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-04-19T18:04:28.485667" elapsed="0.000526"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.486375" level="INFO">Length is 2.</msg>
<msg time="2026-04-19T18:04:28.486426" 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-04-19T18:04:28.486289" elapsed="0.000152"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.486614" level="INFO">卖盘数据包含 2 个元素</msg>
<arg>${side}数据包含 ${level_length} 个元素</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:28.486514" elapsed="0.000127"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.487804" level="INFO">卖盘价格: 75045.25, 数量: 2.806720</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-04-19T18:04:28.486846" elapsed="0.001008"/>
</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-04-19T18:04:28.486712" elapsed="0.001198"/>
</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-04-19T18:04:28.488228" elapsed="0.000172"/>
</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-04-19T18:04:28.488041" elapsed="0.000391"/>
</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-04-19T18:04:28.488630" elapsed="0.000158"/>
</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-04-19T18:04:28.488508" elapsed="0.000312"/>
</kw>
<arg>${asks[0]}</arg>
<arg>卖盘</arg>
<doc>验证单个价格层级数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:28.484725" elapsed="0.004174"/>
</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-04-19T18:04:28.484525" elapsed="0.004414"/>
</kw>
<arg>${depth_dict['asks']}</arg>
<doc>验证卖盘数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:28.483242" elapsed="0.005752"/>
</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-04-19T18:04:28.483025" elapsed="0.006007"/>
</kw>
<arg>${data}</arg>
<doc>验证深度数据字典的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:28.471137" elapsed="0.017949"/>
</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-04-19T18:04:28.470644" elapsed="0.018481"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.489695" 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-04-19T18:04:28.489236" elapsed="0.000503"/>
</kw>
<doc>验证市场深度数据接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-04-19T18:04:27.639152" elapsed="0.850722"/>
</test>
<doc>市场深度数据接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:27.623566" elapsed="0.866617"/>
</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-04-19T18:04:28.494271" 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-04-19T18:04:28.494088" elapsed="0.000209"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.494598" 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-04-19T18:04:28.494518" elapsed="0.000108"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:28.494383" elapsed="0.000264"/>
</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-04-19T18:04:28.494727" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:28.494665" elapsed="0.000094"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:28.494358" elapsed="0.000413"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.495339" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:28.495231" elapsed="0.000148"/>
</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-04-19T18:04:28.495579" 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-04-19T18:04:28.495689" 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-04-19T18:04:28.495790" 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-04-19T18:04:28.495890" 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-04-19T18:04:28.495991" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:28.495437" elapsed="0.000599"/>
</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-04-19T18:04:28.496195" 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-04-19T18:04:28.496300" elapsed="0.001275"/>
</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-04-19T18:04:28.497665" 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-04-19T18:04:28.497758" 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-04-19T18:04:28.497847" 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-04-19T18:04:28.497934" 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-04-19T18:04:28.498019" 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-04-19T18:04:28.498104" 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-04-19T18:04:28.498190" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:28.496057" elapsed="0.002170"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.498497" 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-04-19T18:04:28.498317" elapsed="0.000212"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.498764" 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-04-19T18:04:28.498629" elapsed="0.000161"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.498983" 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-04-19T18:04:28.498856" elapsed="0.000151"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.499241" 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-04-19T18:04:28.499074" elapsed="0.000197"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.499519" 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-04-19T18:04:28.499355" elapsed="0.000194"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.499798" 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-04-19T18:04:28.499631" elapsed="0.000198"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.500089" 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-04-19T18:04:28.499913" elapsed="0.000206"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.500379" 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-04-19T18:04:28.500202" elapsed="0.000208"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.500664" 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-04-19T18:04:28.500492" elapsed="0.000195"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:28.498244" elapsed="0.002464"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:28.495421" elapsed="0.005300"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.500874" 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-04-19T18:04:28.500778" elapsed="0.000124"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:28.501158" 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-04-19T18:04:28.500970" elapsed="0.000337"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:28.495004" elapsed="0.006354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.501509" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:28.501440" elapsed="0.000102"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:28.493880" elapsed="0.007703"/>
</kw>
<test id="s1-s4-s2-s3-t1" name="获取市场盘口数据" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:28.503643" 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-04-19T18:04:28.503142" elapsed="0.000524"/>
</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-04-19T18:04:28.504182" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:28.503766" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:28.503750" elapsed="0.000500"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:28.504277" elapsed="0.000035"/>
</return>
<msg time="2026-04-19T18:04:28.504449" 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-04-19T18:04:28.502643" elapsed="0.001828"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:29.374672" 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-04-19T18:04:29.375076" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/spot/market/public/plate 
 status=200, reason=OK 
 headers={'Date': 'Sun, 19 Apr 2026 10:04:29 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': '141.11.146.71', 'X-Trace-ID': '86df816bd2596750b66002bb3e31ef04', 'X-Transparent': '00-86df816bd2596750b66002bb3e31ef04-42942b12bb1a21ed-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': '9eeb15db1aba08e9-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":[],"ts":1776593069340} 
 </msg>
<msg time="2026-04-19T18:04:29.375422" 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-04-19T18:04:29.375801" 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-04-19T18:04:28.505056" elapsed="0.870807"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:29.376100" elapsed="0.000142"/>
</return>
<msg time="2026-04-19T18:04:29.376651" 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-04-19T18:04:28.504592" elapsed="0.872120"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.379936" 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-04-19T18:04:29.378506" elapsed="0.001608"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.381558" 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-04-19T18:04:29.380455" elapsed="0.001176"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.382210" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:29.381903" elapsed="0.000409"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:29.377325" elapsed="0.005124"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.384853" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [], 'ts': 1776593069340}</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-04-19T18:04:29.383607" elapsed="0.001314"/>
</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-04-19T18:04:29.385190" elapsed="0.000412"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.386097" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:29.385839" elapsed="0.000350"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-04-19T18:04:29.382842" elapsed="0.003467"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.387942" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [], 'ts': 1776593069340}</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-04-19T18:04:29.387090" elapsed="0.000905"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.389365" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [],
  "ts": 1776593069340
}</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-04-19T18:04:29.388227" elapsed="0.001189"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.389891" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [],
  "ts": 1776593069340
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:29.389616" elapsed="0.000422"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-04-19T18:04:29.386633" elapsed="0.003499"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:29.391063" 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-04-19T18:04:29.390304" elapsed="0.000792"/>
</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-04-19T18:04:29.391252" elapsed="0.000328"/>
</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-04-19T18:04:29.392514" elapsed="0.000248"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.393061" level="INFO">Length is 0.</msg>
<msg time="2026-04-19T18:04:29.393147" 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-04-19T18:04:29.392915" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.393464" level="INFO">盘口数据列表包含 0 个盘口</msg>
<arg>盘口数据列表包含 ${length} 个盘口</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:29.393317" elapsed="0.000198"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>${length} &gt; 0</arg>
<arg>验证盘口数据项结构</arg>
<arg>${plate_list[0]}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-19T18:04:29.393654" elapsed="0.000162"/>
</kw>
<arg>${data}</arg>
<doc>验证盘口数据列表的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:29.392169" elapsed="0.001721"/>
</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-04-19T18:04:29.391762" elapsed="0.002181"/>
</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-04-19T18:04:29.394145" elapsed="0.000188"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.395425" 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-04-19T18:04:29.394920" elapsed="0.000532"/>
</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-04-19T18:04:29.395751" elapsed="0.000521"/>
</kw>
<msg time="2026-04-19T18:04:29.396363" 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-04-19T18:04:29.395580" elapsed="0.000808"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.396696" 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-04-19T18:04:29.396531" elapsed="0.000192"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.397047" 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-04-19T18:04:29.396848" elapsed="0.000226"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.397369" 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-04-19T18:04:29.397197" elapsed="0.000199"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.397811" 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-04-19T18:04:29.397517" elapsed="0.000323"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.398160" 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-04-19T18:04:29.397956" elapsed="0.000231"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.398431" 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-04-19T18:04:29.398307" elapsed="0.000172"/>
</kw>
<arg>获取市场盘口数据</arg>
<arg>/v1/spot/market/public/plate</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-04-19T18:04:29.394588" elapsed="0.003955"/>
</kw>
<doc>验证市场盘口数据接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-04-19T18:04:28.501632" elapsed="0.897083"/>
</test>
<doc>市场盘口数据接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:28.490873" elapsed="0.908263"/>
</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-04-19T18:04:29.405251" 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-04-19T18:04:29.405019" elapsed="0.000268"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.406008" 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-04-19T18:04:29.405842" elapsed="0.000221"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:29.405393" elapsed="0.000711"/>
</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-04-19T18:04:29.406250" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:29.406134" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:29.405368" elapsed="0.000958"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.406953" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:29.406898" elapsed="0.000077"/>
</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-04-19T18:04:29.407076" 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-04-19T18:04:29.407134" 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-04-19T18:04:29.407185" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:29.407238" elapsed="0.000009"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:29.407295" elapsed="0.000007"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:29.407003" elapsed="0.002028"/>
</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-04-19T18:04:29.409337" 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-04-19T18:04:29.409406" 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-04-19T18:04:29.409465" elapsed="0.000009"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:29.409519" 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-04-19T18:04:29.409570" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:29.409622" 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-04-19T18:04:29.409671" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:29.409722" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:29.409773" elapsed="0.000007"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:29.409096" elapsed="0.000698"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.409969" 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-04-19T18:04:29.409853" elapsed="0.000141"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.410265" 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-04-19T18:04:29.410045" elapsed="0.000270"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.410674" 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-04-19T18:04:29.410438" elapsed="0.000281"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.411079" 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-04-19T18:04:29.410841" elapsed="0.000284"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.411486" 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-04-19T18:04:29.411246" elapsed="0.000284"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.411893" 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-04-19T18:04:29.411651" elapsed="0.000286"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.412313" 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-04-19T18:04:29.412055" elapsed="0.000303"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.412726" 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-04-19T18:04:29.412478" elapsed="0.000293"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.413084" 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-04-19T18:04:29.412889" elapsed="0.000213"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:29.409806" elapsed="0.003312"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:29.406996" elapsed="0.006133"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.413253" 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-04-19T18:04:29.413175" elapsed="0.000100"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:29.413472" 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-04-19T18:04:29.413327" elapsed="0.000241"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:29.406645" elapsed="0.006956"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.413694" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:29.413651" elapsed="0.000062"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:29.404743" elapsed="0.008995"/>
</kw>
<test id="s1-s4-s2-s4-t1" name="获取市场交易对列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:29.415716" 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-04-19T18:04:29.415075" elapsed="0.000670"/>
</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-04-19T18:04:29.416412" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:29.415893" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:29.415874" elapsed="0.000619"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:29.416525" elapsed="0.000032"/>
</return>
<msg time="2026-04-19T18:04:29.416727" 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-04-19T18:04:29.414347" elapsed="0.002407"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:30.233588" 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-04-19T18:04:30.234060" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/spot/market/public/symbol 
 status=200, reason=OK 
 headers={'Date': 'Sun, 19 Apr 2026 10:04:30 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': '141.11.146.71', 'X-Trace-ID': 'c9b9a449fc127d1ab02476a5ec1691e2', 'X-Transparent': '00-c9b9a449fc127d1ab02476a5ec1691e2-c25df13472f5cdbe-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': '9eeb15df2d3008f9-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"time":1776593069996,"version":"e761632b9e620fd181ed24a0011f3c3c","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":616,"symbol":"eth_usdt","displayName":"ETH_USDT","state":"ONLINE","stateTime":1733452840000,"tradingEnabled":true,"openapiEnabled":false,"nextStateTime":null,"nextState":null,"depthMergePrecision":4,"baseCurrency":"eth","baseCurrencyPrecision":8,"baseCurrencyId":5,"quoteCurrency":"usdt","quoteCurrencyPrecision":8,"quoteCurrencyId":11,"pricePrecision":2,"quantityPrecision":3,"orderTypes":["LIMIT","MARKET"],"timeInForces":["GTC","IOC"],"displayWeight":100002,"displayLevel":"FULL","plates":[],"filters":[{"filter":"QUANTITY","min":"0.001","max":"1000","tickSize":"0.001"},{"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":9479,"symbol":"doge_usdc","displayName":"DOGE_USDC","state":"ONLINE","stateTime":1753718400000,"tradingEnabled":true,"openapiEnabled":false,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"doge","baseCurrencyPrecision":18,"baseCurrencyId":131,"quoteCurrency":"usdc","quoteCurrencyPrecision":8,"quoteCurrencyId":2749,"pricePrecision":5,"quantityPrecision":0,"orderTypes":[],"timeInForces":[],"displayWeight":1000,"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":9438,"symbol":"doge_usdt","displayName":"DOGE_USDT","state":"ONLINE","stateTime":1736924257000,"tradingEnabled":true,"openapiEnabled":true,"nextStateTime":null,"nextState":null,"depthMergePrecision":5,"baseCurrency":"doge","baseCurrencyPrecision":18,"baseCurrencyId":131,"quoteCurrency":"usdt","quoteCurrencyPrecision":8,"quoteCurrencyId":11,"pricePrecision":5,"quantityPrecision":0,"orderTypes":[],"timeInForces":[],"displayWeight":1000,"displayLevel":"FULL","plates":[],"filters":[{"filter":"PROTECTION_ONLINE","durationSeconds":"300","maxPriceMultiple":"5"}]},{"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,"disp... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-19T18:04:30.234537" 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-04-19T18:04:30.234915" 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-04-19T18:04:29.417564" elapsed="0.817421"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:30.235216" elapsed="0.000133"/>
</return>
<msg time="2026-04-19T18:04:30.235741" 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-04-19T18:04:29.416899" elapsed="0.818899"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.238999" 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-04-19T18:04:30.237224" elapsed="0.001945"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.240375" 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-04-19T18:04:30.239471" elapsed="0.000955"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.240871" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:30.240640" elapsed="0.000305"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:30.236361" elapsed="0.004679"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.244096" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'time': 1776593069996, 'version': 'e761632b9e620fd181ed24a0011f3c3c', '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-04-19T18:04:30.241863" elapsed="0.002282"/>
</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-04-19T18:04:30.244334" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.245013" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:30.244807" elapsed="0.000274"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-04-19T18:04:30.241360" elapsed="0.003810"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.247982" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'time': 1776593069996, 'version': 'e761632b9e620fd181ed24a0011f3c3c', '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-04-19T18:04:30.245931" elapsed="0.002091"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.251706" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "time": 1776593069996,
    "version": "e761632b9e620fd181ed24a0011f3c3c",
    "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-04-19T18:04:30.248174" elapsed="0.003571"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.252221" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "time": 1776593069996,
    "version": "e761632b9e620fd181ed24a0011f3c3c",
    "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": 616,
        "symbol": "eth_usdt",
        "displayName": "ETH_USDT",
        "state": "ONLINE",
        "stateTime": 1733452840000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 4,
        "baseCurrency": "eth",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 5,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 2,
        "quantityPrecision": 3,
        "orderTypes": [
          "LIMIT",
          "MARKET"
        ],
        "timeInForces": [
          "GTC",
          "IOC"
        ],
        "displayWeight": 100002,
        "displayLevel": "FULL",
        "plates": [],
        "filters": [
          {
            "filter": "QUANTITY",
            "min": "0.001",
            "max": "1000",
            "tickSize": "0.001"
          },
          {
            "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": 9479,
        "symbol": "doge_usdc",
        "displayName": "DOGE_USDC",
        "state": "ONLINE",
        "stateTime": 1753718400000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "doge",
        "baseCurrencyPrecision": 18,
        "baseCurrencyId": 131,
        "quoteCurrency": "usdc",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 2749,
        "pricePrecision": 5,
        "quantityPrecision": 0,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1000,
        "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": 9438,
        "symbol": "doge_usdt",
        "displayName": "DOGE_USDT",
        "state": "ONLINE",
        "stateTime": 1736924257000,
        "tradingEnabled": true,
        "openapiEnabled": true,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "doge",
        "baseCurrencyPrecision": 18,
        "baseCurrencyId": 131,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 5,
        "quantityPrecision": 0,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1000,
        "displayLevel": "FULL",
        "plates": [],
        "filters": [
          {
            "filter": "PROTECTION_ONLINE",
            "durationSeconds": "300",
            "maxPriceMultiple": "5"
          }
        ]
      },
      {
        "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": []
      },
      {
        "id": 9471,
        "symbol": "tao_usdt",
        "displayName": "TAO_USDT",
        "state": "ONLINE",
        "stateTime": 1739500351000,
        "tradingEnabled": true,
        "openapiEnabled": false,
        "nextStateTime": null,
        "nextState": null,
        "depthMergePrecision": 5,
        "baseCurrency": "tao",
        "baseCurrencyPrecision": 8,
        "baseCurrencyId": 47,
        "quoteCurrency": "usdt",
        "quoteCurrencyPrecision": 8,
        "quoteCurrencyId": 11,
        "pricePrecision": 1,
        "quantityPrecision": 1,
        "orderTypes": [],
        "timeInForces": [],
        "displayWeight": 1,
        "displayLevel": "FULL",
        "plates": [],
        "filters": []
      }
    ]
  },
  "ts": 1776593069996
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:30.251903" elapsed="0.000930"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-04-19T18:04:30.245435" elapsed="0.007474"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:30.254529" level="INFO">${data} = {'time': 1776593069996, 'version': 'e761632b9e620fd181ed24a0011f3c3c', '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-04-19T18:04:30.253054" elapsed="0.001512"/>
</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-04-19T18:04:30.254710" elapsed="0.000355"/>
</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-04-19T18:04:30.255220" elapsed="0.000197"/>
</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-04-19T18:04:30.256199" elapsed="0.000246"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-04-19T18:04:30.256739" 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-04-19T18:04:30.256569" elapsed="0.000197"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.256981" level="INFO">Length is 3.</msg>
<msg time="2026-04-19T18:04:30.257049" 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-04-19T18:04:30.256870" elapsed="0.000204"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.257316" level="INFO">交易对字典包含 3 个字段</msg>
<arg>交易对字典包含 ${count} 个字段</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:30.257185" elapsed="0.000174"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.258056" level="INFO">交易对字典内容: {'time': 1776593069996, 'version': 'e761632b9e620fd181ed24a0011f3c3c', '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': 616, 'symbol': 'eth_usdt', 'displayName': 'ETH_USDT', 'state': 'ONLINE', 'stateTime': 1733452840000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 4, 'baseCurrency': 'eth', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 5, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 2, 'quantityPrecision': 3, 'orderTypes': ['LIMIT', 'MARKET'], 'timeInForces': ['GTC', 'IOC'], 'displayWeight': 100002, 'displayLevel': 'FULL', 'plates': [], 'filters': [{'filter': 'QUANTITY', 'min': '0.001', 'max': '1000', 'tickSize': '0.001'}, {'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': 9479, 'symbol': 'doge_usdc', 'displayName': 'DOGE_USDC', 'state': 'ONLINE', 'stateTime': 1753718400000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'doge', 'baseCurrencyPrecision': 18, 'baseCurrencyId': 131, 'quoteCurrency': 'usdc', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 2749, 'pricePrecision': 5, 'quantityPrecision': 0, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1000, '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': 9438, 'symbol': 'doge_usdt', 'displayName': 'DOGE_USDT', 'state': 'ONLINE', 'stateTime': 1736924257000, 'tradingEnabled': True, 'openapiEnabled': True, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'doge', 'baseCurrencyPrecision': 18, 'baseCurrencyId': 131, 'quoteCurrency': 'usdt', 'quoteCurrencyPrecision': 8, 'quoteCurrencyId': 11, 'pricePrecision': 5, 'quantityPrecision': 0, 'orderTypes': [], 'timeInForces': [], 'displayWeight': 1000, 'displayLevel': 'FULL', 'plates': [], 'filters': [{'filter': 'PROTECTION_ONLINE', 'durationSeconds': '300', 'maxPriceMultiple': '5'}]}, {'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': []}, {'id': 9471, 'symbol': 'tao_usdt', 'displayName': 'TAO_USDT', 'state': 'ONLINE', 'stateTime': 1739500351000, 'tradingEnabled': True, 'openapiEnabled': False, 'nextStateTime': None, 'nextState': None, 'depthMergePrecision': 5, 'baseCurrency': 'tao', 'baseCurrencyPrecision': 8, 'baseCurrencyId': 47, '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-04-19T18:04:30.257463" elapsed="0.000972"/>
</kw>
<arg>${data}</arg>
<doc>验证交易对字典的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:30.255885" elapsed="0.002608"/>
</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-04-19T18:04:30.255544" elapsed="0.002997"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.259568" 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-04-19T18:04:30.259075" elapsed="0.000518"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Should Contain" owner="BuiltIn">
<arg>${response.text}</arg>
<arg>"data"</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-19T18:04:30.259881" elapsed="0.000599"/>
</kw>
<msg time="2026-04-19T18:04:30.260576" 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-04-19T18:04:30.259710" elapsed="0.000890"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.260893" 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-04-19T18:04:30.260738" elapsed="0.000179"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.261221" 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-04-19T18:04:30.261032" elapsed="0.000209"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.261506" 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-04-19T18:04:30.261350" elapsed="0.000179"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.261867" 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-04-19T18:04:30.261627" elapsed="0.000264"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.262159" 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-04-19T18:04:30.261992" elapsed="0.000190"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.262395" 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-04-19T18:04:30.262287" elapsed="0.000148"/>
</kw>
<arg>获取市场交易对列表</arg>
<arg>/v1/spot/market/public/symbol</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-04-19T18:04:30.258753" elapsed="0.003735"/>
</kw>
<doc>验证市场交易对接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-04-19T18:04:29.413770" elapsed="0.848885"/>
</test>
<doc>市场交易对接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:29.400255" elapsed="0.862827"/>
</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-04-19T18:04:30.268723" 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-04-19T18:04:30.268536" elapsed="0.000216"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.269157" 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-04-19T18:04:30.269029" elapsed="0.000170"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:30.268834" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:30.269347" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:30.269255" elapsed="0.000138"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:30.268813" elapsed="0.000597"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.270024" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:30.269911" elapsed="0.000153"/>
</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-04-19T18:04:30.270272" 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-04-19T18:04:30.270385" 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-04-19T18:04:30.270494" 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-04-19T18:04:30.270594" 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-04-19T18:04:30.270693" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:30.270123" elapsed="0.000640"/>
</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-04-19T18:04:30.270933" 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-04-19T18:04:30.271040" 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-04-19T18:04:30.271142" 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-04-19T18:04:30.271247" 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-04-19T18:04:30.271348" 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-04-19T18:04:30.271450" 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-04-19T18:04:30.271549" 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-04-19T18:04:30.271649" 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-04-19T18:04:30.271749" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:30.270787" elapsed="0.001003"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.272111" 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-04-19T18:04:30.271900" elapsed="0.000249"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.272437" 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-04-19T18:04:30.272248" elapsed="0.000226"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.272759" 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-04-19T18:04:30.272570" elapsed="0.000225"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.273087" 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-04-19T18:04:30.272894" elapsed="0.000229"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.273414" 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-04-19T18:04:30.273221" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.273741" 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-04-19T18:04:30.273545" elapsed="0.000231"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.274086" 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-04-19T18:04:30.273876" elapsed="0.000246"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.274420" 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-04-19T18:04:30.274218" elapsed="0.000238"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.274758" 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-04-19T18:04:30.274554" elapsed="0.000240"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:30.271811" elapsed="0.003014"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:30.270107" elapsed="0.004739"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.275079" 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-04-19T18:04:30.274937" elapsed="0.000176"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:30.275438" 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-04-19T18:04:30.275199" elapsed="0.000393"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:30.269674" elapsed="0.005972"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.275805" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:30.275733" elapsed="0.000105"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:30.268302" elapsed="0.007580"/>
</kw>
<test id="s1-s4-s2-s5-t1" name="获取市场服务器时间" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:30.278323" 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-04-19T18:04:30.277770" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:30.278913" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:30.278477" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:30.278461" elapsed="0.000521"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:30.279010" elapsed="0.000036"/>
</return>
<msg time="2026-04-19T18:04:30.279170" 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-04-19T18:04:30.277118" elapsed="0.002071"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:31.076088" 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-04-19T18:04:31.076174" level="INFO">GET Response : url=https://app.bitradex-test.com/v1/spot/market/public/time 
 status=200, reason=OK 
 headers={'Date': 'Sun, 19 Apr 2026 10:04:31 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': '141.11.146.71', 'X-Trace-ID': '69b5e4cdbd0c55d9f8bcb91de79125d5', 'X-Transparent': '00-69b5e4cdbd0c55d9f8bcb91de79125d5-22175730c7a4b745-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': '9eeb15e5ab15eff5-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":{"serverTime":1776593071043},"ts":1776593071043} 
 </msg>
<msg time="2026-04-19T18:04:31.076215" 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-04-19T18:04:31.078184" 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-04-19T18:04:30.279788" elapsed="0.798413"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:31.078252" elapsed="0.000029"/>
</return>
<msg time="2026-04-19T18:04:31.078358" 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-04-19T18:04:30.279293" elapsed="0.799077"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.078906" 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-04-19T18:04:31.078660" elapsed="0.000276"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.079201" 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-04-19T18:04:31.078993" elapsed="0.000220"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.079320" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:31.079262" elapsed="0.000077"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:31.078487" elapsed="0.000877"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.079782" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'serverTime': 1776593071043}, 'ts': 1776593071043}</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-04-19T18:04:31.079562" elapsed="0.000233"/>
</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-04-19T18:04:31.079843" elapsed="0.000078"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.080021" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:31.079967" elapsed="0.000072"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-04-19T18:04:31.079431" elapsed="0.000631"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.080449" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': {'serverTime': 1776593071043}, 'ts': 1776593071043}</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-04-19T18:04:31.080243" elapsed="0.000218"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.080692" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "serverTime": 1776593071043
  },
  "ts": 1776593071043
}</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-04-19T18:04:31.080509" elapsed="0.000196"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.081473" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": {
    "serverTime": 1776593071043
  },
  "ts": 1776593071043
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:31.081397" elapsed="0.000112"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-04-19T18:04:31.080126" elapsed="0.001408"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:31.081800" level="INFO">${data} = {'serverTime': 1776593071043}</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-04-19T18:04:31.081581" elapsed="0.000231"/>
</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-04-19T18:04:31.081863" elapsed="0.000114"/>
</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-04-19T18:04:31.082178" elapsed="0.000180"/>
</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-04-19T18:04:31.082414" elapsed="0.000071"/>
</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-04-19T18:04:31.082780" elapsed="0.000089"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.082974" level="INFO">时间字典内容: {'serverTime': 1776593071043}</msg>
<arg>时间字典内容: ${time_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:31.082918" elapsed="0.000076"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:31.083190" 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-04-19T18:04:31.083102" elapsed="0.000122">Dictionary does not contain key 'timestamp'.</status>
</kw>
<msg time="2026-04-19T18:04:31.083265" 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-04-19T18:04:31.083042" elapsed="0.000233"/>
</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-04-19T18:04:31.083327" elapsed="0.000051"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:31.083558" 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-04-19T18:04:31.083487" elapsed="0.000096">Dictionary does not contain key 'time'.</status>
</kw>
<msg time="2026-04-19T18:04:31.083622" 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-04-19T18:04:31.083429" elapsed="0.000203"/>
</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-04-19T18:04:31.083683" elapsed="0.000047"/>
</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-04-19T18:04:31.083838" elapsed="0.000061"/>
</kw>
<msg time="2026-04-19T18:04:31.083937" 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-04-19T18:04:31.083780" elapsed="0.000167"/>
</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-04-19T18:04:31.084354" elapsed="0.000078"/>
</kw>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.084554" level="INFO">${timestamp_str} = 1776593071043</msg>
<var>${timestamp_str}</var>
<arg>${timestamp}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-04-19T18:04:31.084479" elapsed="0.000086"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.084657" level="INFO">Length is 13.</msg>
<msg time="2026-04-19T18:04:31.084687" 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-04-19T18:04:31.084610" elapsed="0.000087"/>
</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-04-19T18:04:31.084741" elapsed="0.000112"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.084953" level="INFO">服务器时间戳: 1776593071043</msg>
<arg>服务器时间戳: ${timestamp}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:31.084900" elapsed="0.000071"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<kw name="转换毫秒时间戳">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.085366" level="INFO">${seconds} = 1776593071</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-04-19T18:04:31.085286" elapsed="0.000092"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.085488" level="INFO">毫秒时间戳 1776593071043 对应秒级时间戳: 1776593071</msg>
<arg>毫秒时间戳 ${milliseconds} 对应秒级时间戳: ${seconds}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:31.085423" elapsed="0.000084"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.085653" level="INFO">${readable_time} = 2026-04-19 18:04:31</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-04-19T18:04:31.085552" elapsed="0.000132"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.085786" level="INFO">可读时间格式: 2026-04-19 18:04:31</msg>
<arg>可读时间格式: ${readable_time}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:31.085731" elapsed="0.000074"/>
</kw>
<arg>${timestamp}</arg>
<doc>转换毫秒级时间戳为可读格式</doc>
<status status="PASS" start="2026-04-19T18:04:31.085110" elapsed="0.000718"/>
</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-04-19T18:04:31.085016" elapsed="0.000832"/>
</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-04-19T18:04:31.085896" elapsed="0.000055"/>
</kw>
<arg>${time_dict['serverTime']}</arg>
<doc>验证时间戳的格式和有效性</doc>
<status status="PASS" start="2026-04-19T18:04:31.084096" elapsed="0.001881"/>
</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-04-19T18:04:31.083998" elapsed="0.001998"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:31.086172" 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-04-19T18:04:31.086100" elapsed="0.000097">Dictionary does not contain key 'currentTime'.</status>
</kw>
<msg time="2026-04-19T18:04:31.086236" 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-04-19T18:04:31.086043" elapsed="0.000204"/>
</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-04-19T18:04:31.086297" elapsed="0.000048"/>
</kw>
<kw name="Get Dictionary Keys" owner="Collections">
<msg time="2026-04-19T18:04:31.086463" 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-04-19T18:04:31.086393" elapsed="0.000080"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.086565" level="INFO">Length is 1.</msg>
<msg time="2026-04-19T18:04:31.086595" 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-04-19T18:04:31.086518" elapsed="0.000087"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.086714" level="INFO">时间字典包含 1 个字段: ['serverTime']</msg>
<arg>时间字典包含 ${count} 个字段: ${keys}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:31.086650" elapsed="0.000082"/>
</kw>
<arg>${time_data}</arg>
<doc>验证时间字典的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:31.082663" elapsed="0.004092"/>
</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-04-19T18:04:31.082536" elapsed="0.004237"/>
</kw>
<arg>${data}</arg>
<doc>验证时间数据的格式和有效性</doc>
<status status="PASS" start="2026-04-19T18:04:31.082047" elapsed="0.004749"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.087197" 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-04-19T18:04:31.086999" elapsed="0.000209"/>
</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-04-19T18:04:31.087317" elapsed="0.000203"/>
</kw>
<msg time="2026-04-19T18:04:31.087557" 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-04-19T18:04:31.087257" elapsed="0.000310"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.087682" 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-04-19T18:04:31.087619" elapsed="0.000074"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.087827" 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-04-19T18:04:31.087743" elapsed="0.000095"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.087960" 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-04-19T18:04:31.087889" elapsed="0.000082"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.088140" 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-04-19T18:04:31.088022" elapsed="0.000131"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.088291" 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-04-19T18:04:31.088203" elapsed="0.000100"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.088404" 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-04-19T18:04:31.088352" elapsed="0.000087"/>
</kw>
<arg>获取市场服务器时间</arg>
<arg>/v1/spot/market/public/time</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-04-19T18:04:31.086868" elapsed="0.001595"/>
</kw>
<doc>验证市场服务器时间接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-04-19T18:04:30.275942" elapsed="0.812586"/>
</test>
<doc>市场服务器时间接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:30.264349" elapsed="0.824325"/>
</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-04-19T18:04:31.091025" 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-04-19T18:04:31.090937" elapsed="0.000100"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.091217" 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-04-19T18:04:31.091163" elapsed="0.000074"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:31.091076" elapsed="0.000175"/>
</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-04-19T18:04:31.091306" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:31.091262" elapsed="0.000065"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:31.091066" elapsed="0.000270"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.091625" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:31.091573" elapsed="0.000072"/>
</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-04-19T18:04:31.091743" 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-04-19T18:04:31.091796" 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-04-19T18:04:31.091846" 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-04-19T18:04:31.091895" 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-04-19T18:04:31.091943" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:31.091674" elapsed="0.000290"/>
</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-04-19T18:04:31.092041" 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-04-19T18:04:31.092091" 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-04-19T18:04:31.092140" 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-04-19T18:04:31.092188" 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-04-19T18:04:31.092235" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:31.092283" 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-04-19T18:04:31.092330" 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-04-19T18:04:31.092376" 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-04-19T18:04:31.092423" elapsed="0.000007"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:31.091974" elapsed="0.000469"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.092592" 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-04-19T18:04:31.092493" elapsed="0.000117"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.092746" 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-04-19T18:04:31.092656" elapsed="0.000107"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.092901" 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-04-19T18:04:31.092810" elapsed="0.000109"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.093055" 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-04-19T18:04:31.092965" elapsed="0.000107"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.093208" 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-04-19T18:04:31.093117" elapsed="0.000108"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.093381" 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-04-19T18:04:31.093287" elapsed="0.000111"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.093542" 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-04-19T18:04:31.093444" elapsed="0.000115"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.093699" 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-04-19T18:04:31.093606" elapsed="0.000111"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.093860" 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-04-19T18:04:31.093763" elapsed="0.000114"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:31.092452" elapsed="0.001440"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:31.091666" elapsed="0.002235"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.094012" 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-04-19T18:04:31.093944" elapsed="0.000087"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:31.094202" 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-04-19T18:04:31.094076" elapsed="0.000217"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:31.091463" elapsed="0.002861"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.094409" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:31.094370" elapsed="0.000056"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:31.090735" elapsed="0.003717"/>
</kw>
<test id="s1-s4-s2-s6-t1" name="获取热门市场排行榜" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.095129" 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-04-19T18:04:31.095037" elapsed="0.000105"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.095861" 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-04-19T18:04:31.095578" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:31.096152" elapsed="0.000009"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:31.095928" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:31.095919" elapsed="0.000269"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:31.096203" elapsed="0.000015"/>
</return>
<msg time="2026-04-19T18:04:31.096294" 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-04-19T18:04:31.095238" elapsed="0.001067"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:31.807799" 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-04-19T18:04:31.808247" 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': 'Sun, 19 Apr 2026 10:04:31 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': '141.11.146.71', 'X-Trace-ID': 'eb88fe7f631715996327e50f0de864f9', 'X-Transparent': '00-eb88fe7f631715996327e50f0de864f9-47a089ec85b0ab5a-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': '9eeb15e9fe108b92-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":[],"ts":1776593071718} 
 </msg>
<msg time="2026-04-19T18:04:31.808438" 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-04-19T18:04:31.809024" 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-04-19T18:04:31.096547" elapsed="0.712543"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:31.809367" elapsed="0.000183"/>
</return>
<msg time="2026-04-19T18:04:31.809985" 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-04-19T18:04:31.096367" elapsed="0.713674"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.813744" 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-04-19T18:04:31.812398" elapsed="0.001507"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.815202" 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-04-19T18:04:31.814180" elapsed="0.001080"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.815782" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:31.815506" elapsed="0.000365"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:31.810741" elapsed="0.005234"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.817588" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [], 'ts': 1776593071718}</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-04-19T18:04:31.816719" elapsed="0.000912"/>
</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-04-19T18:04:31.817818" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.818457" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:31.818279" elapsed="0.000243"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-04-19T18:04:31.816247" elapsed="0.002362"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.820005" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [], 'ts': 1776593071718}</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-04-19T18:04:31.819251" elapsed="0.000796"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.820815" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [],
  "ts": 1776593071718
}</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-04-19T18:04:31.820190" elapsed="0.000659"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.821200" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [],
  "ts": 1776593071718
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:31.820987" elapsed="0.000339"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-04-19T18:04:31.818840" elapsed="0.002554"/>
</kw>
<doc>验证热门市场排行榜接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-04-19T18:04:31.094481" elapsed="0.727131"/>
</test>
<doc>热门市场排行榜接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:31.089122" elapsed="0.733019"/>
</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-04-19T18:04:31.829123" 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-04-19T18:04:31.828926" elapsed="0.000224"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.829578" 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-04-19T18:04:31.829464" elapsed="0.000156"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:31.829255" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:31.829773" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:31.829683" elapsed="0.000141"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:31.829225" elapsed="0.000621"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.830473" level="INFO">设置环境: bitradex_test</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:31.830367" 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-04-19T18:04:31.830732" 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-04-19T18:04:31.830846" 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-04-19T18:04:31.830957" 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-04-19T18:04:31.831069" 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-04-19T18:04:31.831229" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:31.830571" elapsed="0.000706"/>
</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-04-19T18:04:31.831434" 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-04-19T18:04:31.831538" 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-04-19T18:04:31.831639" 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-04-19T18:04:31.831963" elapsed="0.000049"/>
</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-04-19T18:04:31.832147" elapsed="0.000023"/>
</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-04-19T18:04:31.832284" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-04-19T18:04:31.832417" 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-04-19T18:04:31.832548" 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-04-19T18:04:31.832671" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:31.831301" elapsed="0.001423"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.833229" 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-04-19T18:04:31.832876" elapsed="0.000414"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.833677" 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-04-19T18:04:31.833420" elapsed="0.000308"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.834084" 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-04-19T18:04:31.833850" elapsed="0.000278"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.834488" 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-04-19T18:04:31.834247" elapsed="0.000284"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.834885" 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-04-19T18:04:31.834646" elapsed="0.000284"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.835290" 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-04-19T18:04:31.835050" elapsed="0.000287"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.835727" 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-04-19T18:04:31.835460" elapsed="0.000311"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.836110" 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-04-19T18:04:31.835888" elapsed="0.000262"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.836458" 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-04-19T18:04:31.836251" elapsed="0.000243"/>
</kw>
<status status="PASS" start="2026-04-19T18:04:31.832761" elapsed="0.003765"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:31.830556" elapsed="0.005990"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.836830" 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-04-19T18:04:31.836651" elapsed="0.000223"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:31.837263" 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-04-19T18:04:31.836981" elapsed="0.000462"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-04-19T18:04:31.830141" elapsed="0.007370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.837707" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:31.837619" elapsed="0.000127"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-04-19T18:04:31.828529" elapsed="0.009270"/>
</kw>
<test id="s1-s4-s2-s7-t1" name="获取最近交易记录" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.839183" 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-04-19T18:04:31.838972" elapsed="0.000237"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-19T18:04:31.840893" 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-04-19T18:04:31.840273" elapsed="0.000649"/>
</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-04-19T18:04:31.841579" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-19T18:04:31.841052" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-04-19T18:04:31.841029" elapsed="0.000631"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-04-19T18:04:31.841692" elapsed="0.000030"/>
</return>
<msg time="2026-04-19T18:04:31.841884" 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-04-19T18:04:31.839486" elapsed="0.002422"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-19T18:04:32.688668" 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-04-19T18:04:32.688860" 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': 'Sun, 19 Apr 2026 10:04:32 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': '141.11.146.71', 'X-Trace-ID': '85e13be515e7a22b17d20fab85aa7534', 'X-Transparent': '00-85e13be515e7a22b17d20fab85aa7534-1024e0ba07c88f0a-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': '9eeb15ef9e99dba0-HKG', 'alt-svc': 'h3=":443"; ma=86400'} 
 body={"code":0,"msg":"success","msgInfo":[],"data":[{"i":616105802543150144,"t":1776593070193,"p":"75042.55","q":"0.000960","v":"72.040848","b":true},{"i":616105800177562688,"t":1776593069609,"p":"75045.25","q":"0.001070","v":"80.2984175","b":true},{"i":616105796880839744,"t":1776593068716,"p":"75045.24","q":"0.001130","v":"84.8011212","b":false},{"i":616105794641081408,"t":1776593068274,"p":"75045.24","q":"0.001250","v":"93.80655","b":false},{"i":616105791474381888,"t":1776593067425,"p":"75045.24","q":"0.000870","v":"65.2893588","b":false},{"i":616105788269933632,"t":1776593066656,"p":"75045.24","q":"0.001340","v":"100.5606216","b":false},{"i":616105785858208832,"t":1776593066208,"p":"75045.25","q":"0.000880","v":"66.03982","b":true},{"i":616105782485988416,"t":1776593065294,"p":"75045.24","q":"0.001570","v":"117.8210268","b":false},{"i":616105779659027520,"t":1776593064708,"p":"75045.25","q":"0.001770","v":"132.8300925","b":true},{"i":616105776211309632,"t":1776593063884,"p":"75045.25","q":"0.001930","v":"144.8373325","b":true},{"i":616105774646834240,"t":1776593063501,"p":"75045.24","q":"0.001860","v":"139.5841464","b":false},{"i":616105771975062592,"t":1776593062900,"p":"75045.24","q":"0.002060","v":"154.5931944","b":false},{"i":616105770540610624,"t":1776593062522,"p":"75045.24","q":"0.001300","v":"97.558812","b":false},{"i":616105768477013056,"t":1776593061945,"p":"75045.24","q":"0.002020","v":"151.5913848","b":false},{"i":616105766824457280,"t":1776593061578,"p":"75045.25","q":"0.001770","v":"132.8300925","b":true},{"i":616105763037000768,"t":1776593060740,"p":"75062.74","q":"0.001520","v":"114.0953648","b":true},{"i":616105760088405056,"t":1776593059964,"p":"75062.74","q":"0.001450","v":"108.840973","b":true},{"i":616105758729450560,"t":1776593059711,"p":"75062.74","q":"0.002140","v":"160.6342636","b":true},{"i":616105756787487808,"t":1776593059217,"p":"75062.73","q":"0.001370","v":"102.8359401","b":false},{"i":616105755097183296,"t":1776593058779,"p":"75062.73","q":"0.001370","v":"102.8359401","b":false},{"i":616105751758517312,"t":1776593058033,"p":"75062.73","q":"0.001480","v":"111.0928404","b":false},{"i":616105748017198144,"t":1776593057067,"p":"75062.73","q":"0.002010","v":"150.8760873","b":false},{"i":616105746284950592,"t":1776593056681,"p":"75062.74","q":"0.003050","v":"228.941357","b":true},{"i":616105743332160576,"t":1776593055962,"p":"75062.73","q":"0.002330","v":"174.8961609","b":false},{"i":616105740379370560,"t":1776593055241,"p":"75062.74","q":"0.002410","v":"180.9012034","b":true},{"i":616105736927458368,"t":1776593054522,"p":"75062.73","q":"0.003070","v":"230.4425811","b":false},{"i":616105734297629760,"t":1776593053920,"p":"75062.73","q":"0.002780","v":"208.6743894","b":false},{"i":616105731474863168,"t":1776593053130,"p":"75062.73","q":"0.003390","v":"254.4626547","b":false},{"i":616105729574843456,"t":1776593052762,"p":"75062.73","q":"0.002400","v":"180.150552","b":false},{"i":616105727620297792,"t":1776593052292,"p":"75062.74","q":"0.003740","v":"280.7346476","b":true}],"ts":1776593072640} 
 </msg>
<msg time="2026-04-19T18:04:32.689060" 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-04-19T18:04:32.689359" 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-04-19T18:04:31.842439" elapsed="0.846956"/>
</kw>
<return>
<value>${response}</value>
<status status="PASS" start="2026-04-19T18:04:32.689545" elapsed="0.000066"/>
</return>
<msg time="2026-04-19T18:04:32.689806" 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-04-19T18:04:31.842046" elapsed="0.847789"/>
</kw>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.691137" 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-04-19T18:04:32.690570" elapsed="0.000645"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.691915" 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-04-19T18:04:32.691366" elapsed="0.000597"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.692295" level="INFO">接口响应成功，状态码: 200</msg>
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:32.692154" elapsed="0.000184"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="PASS" start="2026-04-19T18:04:32.690180" elapsed="0.002219"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.693497" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [{'i': 616105802543150144, 't': 1776593070193, 'p': '75042.55', 'q': '0.000960', 'v': '72.040848', 'b': True}, {'i': 616105800177562688, 't': 17765...</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-04-19T18:04:32.692882" 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-04-19T18:04:32.693651" elapsed="0.000173"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.694065" level="INFO">响应包含字段: data</msg>
<arg>响应包含字段: ${field_name}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:32.693936" elapsed="0.000170"/>
</kw>
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="PASS" start="2026-04-19T18:04:32.692567" elapsed="0.001599"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.695178" level="INFO">${json_data} = {'code': 0, 'msg': 'success', 'msgInfo': [], 'data': [{'i': 616105802543150144, 't': 1776593070193, 'p': '75042.55', 'q': '0.000960', 'v': '72.040848', 'b': True}, {'i': 616105800177562688, 't': 17765...</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-04-19T18:04:32.694606" elapsed="0.000602"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.695976" level="INFO">${json_str} = {
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [
    {
      "i": 616105802543150144,
      "t": 1776593070193,
      "p": "75042.55",
      "q": "0.000960",
      "v": "72.040848",
   ...</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-04-19T18:04:32.695323" elapsed="0.000685"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.696315" level="INFO">{
  "code": 0,
  "msg": "success",
  "msgInfo": [],
  "data": [
    {
      "i": 616105802543150144,
      "t": 1776593070193,
      "p": "75042.55",
      "q": "0.000960",
      "v": "72.040848",
      "b": true
    },
    {
      "i": 616105800177562688,
      "t": 1776593069609,
      "p": "75045.25",
      "q": "0.001070",
      "v": "80.2984175",
      "b": true
    },
    {
      "i": 616105796880839744,
      "t": 1776593068716,
      "p": "75045.24",
      "q": "0.001130",
      "v": "84.8011212",
      "b": false
    },
    {
      "i": 616105794641081408,
      "t": 1776593068274,
      "p": "75045.24",
      "q": "0.001250",
      "v": "93.80655",
      "b": false
    },
    {
      "i": 616105791474381888,
      "t": 1776593067425,
      "p": "75045.24",
      "q": "0.000870",
      "v": "65.2893588",
      "b": false
    },
    {
      "i": 616105788269933632,
      "t": 1776593066656,
      "p": "75045.24",
      "q": "0.001340",
      "v": "100.5606216",
      "b": false
    },
    {
      "i": 616105785858208832,
      "t": 1776593066208,
      "p": "75045.25",
      "q": "0.000880",
      "v": "66.03982",
      "b": true
    },
    {
      "i": 616105782485988416,
      "t": 1776593065294,
      "p": "75045.24",
      "q": "0.001570",
      "v": "117.8210268",
      "b": false
    },
    {
      "i": 616105779659027520,
      "t": 1776593064708,
      "p": "75045.25",
      "q": "0.001770",
      "v": "132.8300925",
      "b": true
    },
    {
      "i": 616105776211309632,
      "t": 1776593063884,
      "p": "75045.25",
      "q": "0.001930",
      "v": "144.8373325",
      "b": true
    },
    {
      "i": 616105774646834240,
      "t": 1776593063501,
      "p": "75045.24",
      "q": "0.001860",
      "v": "139.5841464",
      "b": false
    },
    {
      "i": 616105771975062592,
      "t": 1776593062900,
      "p": "75045.24",
      "q": "0.002060",
      "v": "154.5931944",
      "b": false
    },
    {
      "i": 616105770540610624,
      "t": 1776593062522,
      "p": "75045.24",
      "q": "0.001300",
      "v": "97.558812",
      "b": false
    },
    {
      "i": 616105768477013056,
      "t": 1776593061945,
      "p": "75045.24",
      "q": "0.002020",
      "v": "151.5913848",
      "b": false
    },
    {
      "i": 616105766824457280,
      "t": 1776593061578,
      "p": "75045.25",
      "q": "0.001770",
      "v": "132.8300925",
      "b": true
    },
    {
      "i": 616105763037000768,
      "t": 1776593060740,
      "p": "75062.74",
      "q": "0.001520",
      "v": "114.0953648",
      "b": true
    },
    {
      "i": 616105760088405056,
      "t": 1776593059964,
      "p": "75062.74",
      "q": "0.001450",
      "v": "108.840973",
      "b": true
    },
    {
      "i": 616105758729450560,
      "t": 1776593059711,
      "p": "75062.74",
      "q": "0.002140",
      "v": "160.6342636",
      "b": true
    },
    {
      "i": 616105756787487808,
      "t": 1776593059217,
      "p": "75062.73",
      "q": "0.001370",
      "v": "102.8359401",
      "b": false
    },
    {
      "i": 616105755097183296,
      "t": 1776593058779,
      "p": "75062.73",
      "q": "0.001370",
      "v": "102.8359401",
      "b": false
    },
    {
      "i": 616105751758517312,
      "t": 1776593058033,
      "p": "75062.73",
      "q": "0.001480",
      "v": "111.0928404",
      "b": false
    },
    {
      "i": 616105748017198144,
      "t": 1776593057067,
      "p": "75062.73",
      "q": "0.002010",
      "v": "150.8760873",
      "b": false
    },
    {
      "i": 616105746284950592,
      "t": 1776593056681,
      "p": "75062.74",
      "q": "0.003050",
      "v": "228.941357",
      "b": true
    },
    {
      "i": 616105743332160576,
      "t": 1776593055962,
      "p": "75062.73",
      "q": "0.002330",
      "v": "174.8961609",
      "b": false
    },
    {
      "i": 616105740379370560,
      "t": 1776593055241,
      "p": "75062.74",
      "q": "0.002410",
      "v": "180.9012034",
      "b": true
    },
    {
      "i": 616105736927458368,
      "t": 1776593054522,
      "p": "75062.73",
      "q": "0.003070",
      "v": "230.4425811",
      "b": false
    },
    {
      "i": 616105734297629760,
      "t": 1776593053920,
      "p": "75062.73",
      "q": "0.002780",
      "v": "208.6743894",
      "b": false
    },
    {
      "i": 616105731474863168,
      "t": 1776593053130,
      "p": "75062.73",
      "q": "0.003390",
      "v": "254.4626547",
      "b": false
    },
    {
      "i": 616105729574843456,
      "t": 1776593052762,
      "p": "75062.73",
      "q": "0.002400",
      "v": "180.150552",
      "b": false
    },
    {
      "i": 616105727620297792,
      "t": 1776593052292,
      "p": "75062.74",
      "q": "0.003740",
      "v": "280.7346476",
      "b": true
    }
  ],
  "ts": 1776593072640
}</msg>
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:32.696133" elapsed="0.000328"/>
</kw>
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="PASS" start="2026-04-19T18:04:32.694330" elapsed="0.002195"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-19T18:04:32.697497" level="INFO">${data} = [{'i': 616105802543150144, 't': 1776593070193, 'p': '75042.55', 'q': '0.000960', 'v': '72.040848', 'b': True}, {'i': 616105800177562688, 't': 1776593069609, 'p': '75045.25', 'q': '0.001070', 'v': '80....</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-04-19T18:04:32.696640" elapsed="0.000899"/>
</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-04-19T18:04:32.697694" elapsed="0.000298"/>
</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-04-19T18:04:32.698816" elapsed="0.000281"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.699333" level="INFO">Length is 30.</msg>
<msg time="2026-04-19T18:04:32.699400" 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-04-19T18:04:32.699222" elapsed="0.000197"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.699615" level="INFO">交易记录列表包含 30 个交易记录</msg>
<arg>交易记录列表包含 ${list_length} 个交易记录</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:32.699514" elapsed="0.000136"/>
</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-04-19T18:04:32.701051" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.701625" level="INFO">交易记录项内容: {'i': 616105802543150144, 't': 1776593070193, 'p': '75042.55', 'q': '0.000960', 'v': '72.040848', 'b': True}</msg>
<arg>交易记录项内容: ${trade_item}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-19T18:04:32.701474" elapsed="0.000199"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:32.702160" 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-04-19T18:04:32.701949" elapsed="0.000290">Dictionary does not contain key 'id'.</status>
</kw>
<msg time="2026-04-19T18:04:32.702383" 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-04-19T18:04:32.701801" elapsed="0.000608"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:32.702927" 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-04-19T18:04:32.702734" elapsed="0.000257">Dictionary does not contain key 'price'.</status>
</kw>
<msg time="2026-04-19T18:04:32.703098" 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-04-19T18:04:32.702566" elapsed="0.000559"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:32.703579" 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-04-19T18:04:32.703421" elapsed="0.000212">Dictionary does not contain key 'qty'.</status>
</kw>
<msg time="2026-04-19T18:04:32.703718" 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-04-19T18:04:32.703269" elapsed="0.000471"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:32.704119" 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-04-19T18:04:32.703977" elapsed="0.000191">Dictionary does not contain key 'quoteQty'.</status>
</kw>
<msg time="2026-04-19T18:04:32.704244" 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-04-19T18:04:32.703857" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:32.704629" 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-04-19T18:04:32.704490" elapsed="0.000188">Dictionary does not contain key 'time'.</status>
</kw>
<msg time="2026-04-19T18:04:32.704759" 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-04-19T18:04:32.704371" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:32.705170" 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-04-19T18:04:32.705019" elapsed="0.000202">Dictionary does not contain key 'isBuyerMaker'.</status>
</kw>
<msg time="2026-04-19T18:04:32.705305" 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-04-19T18:04:32.704892" elapsed="0.000435"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:32.705733" 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-04-19T18:04:32.705578" elapsed="0.000207">Dictionary does not contain key 'side'.</status>
</kw>
<msg time="2026-04-19T18:04:32.705865" 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-04-19T18:04:32.705444" elapsed="0.000445"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-19T18:04:32.706646" 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-04-19T18:04:32.706243" elapsed="0.000469">Dictionary does not contain key 'symbol'.</status>
</kw>
<msg time="2026-04-19T18:04:32.706812" 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-04-19T18:04:32.706067" elapsed="0.000768"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.707116" 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-04-19T18:04:32.706968" elapsed="0.000193"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.707388" 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-04-19T18:04:32.707266" elapsed="0.000159"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.707626" 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-04-19T18:04:32.707520" elapsed="0.000144"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.707864" 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-04-19T18:04:32.707758" elapsed="0.000142"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.708095" 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-04-19T18:04:32.707993" elapsed="0.000137"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.708324" 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-04-19T18:04:32.708216" elapsed="0.000144"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.708626" 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-04-19T18:04:32.708513" elapsed="0.000149"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.708839" 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-04-19T18:04:32.708746" elapsed="0.000134"/>
</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-04-19T18:04:32.708972" elapsed="0.000091"/>
</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-04-19T18:04:32.709156" elapsed="0.000082"/>
</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-04-19T18:04:32.709334" elapsed="0.000082"/>
</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-04-19T18:04:32.709509" elapsed="0.000081"/>
</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-04-19T18:04:32.709685" elapsed="0.000084"/>
</kw>
<arg>${trade_list[0]}</arg>
<doc>验证单个交易记录的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:32.700065" elapsed="0.009765"/>
</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-04-19T18:04:32.699743" elapsed="0.010131"/>
</kw>
<arg>${data}</arg>
<doc>验证交易记录列表的数据结构</doc>
<status status="PASS" start="2026-04-19T18:04:32.698464" elapsed="0.011463"/>
</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-04-19T18:04:32.698139" elapsed="0.011829"/>
</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-04-19T18:04:32.710084" elapsed="0.000203"/>
</kw>
<kw name="本次测试简报" owner="common">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.711284" 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-04-19T18:04:32.710817" elapsed="0.000519"/>
</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-04-19T18:04:32.711521" elapsed="0.000263"/>
</kw>
<msg time="2026-04-19T18:04:32.711829" 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-04-19T18:04:32.711427" elapsed="0.000414"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.711964" 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-04-19T18:04:32.711896" elapsed="0.000080"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.712123" 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-04-19T18:04:32.712028" elapsed="0.000106"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.712258" 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-04-19T18:04:32.712186" elapsed="0.000084"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.712434" 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-04-19T18:04:32.712318" elapsed="0.000129"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.712582" 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-04-19T18:04:32.712496" elapsed="0.000098"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-19T18:04:32.712697" 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-04-19T18:04:32.712642" elapsed="0.000074"/>
</kw>
<arg>获取最近交易记录</arg>
<arg>/v1/spot/market/public/trade/recent</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="PASS" start="2026-04-19T18:04:32.710481" elapsed="0.002262"/>
</kw>
<doc>验证最近交易记录接口功能</doc>
<tag>market</tag>
<status status="PASS" start="2026-04-19T18:04:31.837862" elapsed="0.874944"/>
</test>
<doc>最近交易记录接口测试</doc>
<status status="PASS" start="2026-04-19T18:04:31.823772" elapsed="0.889182"/>
</suite>
<status status="PASS" start="2026-04-19T18:04:26.787066" elapsed="5.926381"/>
</suite>
<status status="PASS" start="2026-04-19T18:04:24.484025" elapsed="8.229754"/>
</suite>
<status status="PASS" start="2026-04-19T18:04:02.197549" elapsed="30.516665"/>
</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>
