<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.3.2 (Python 3.9.6 on darwin)" generated="2026-05-28T22:27:08.480843" rpa="false" schemaversion="5">
<suite id="s1" name="BitRadeX_API测试_prod" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests">
<suite id="s1-s1" name="App" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/app">
<suite id="s1-s1-s1" name="Ad List" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/app/ad_list.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:08.571214" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:08.571115" elapsed="0.000115"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:08.571357" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:08.571271" elapsed="0.000108"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:08.571483" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:08.571427" elapsed="0.000076"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:08.571389" elapsed="0.000127"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:08.571261" elapsed="0.000262"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:08.571784" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:08.571736" elapsed="0.000065"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:08.571887" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:08.571934" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:08.571977" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:08.572020" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:08.572062" elapsed="0.000006"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:08.571825" elapsed="0.000255"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:08.572438" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:08.572145" elapsed="0.000310"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:08.572748" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:08.572498" elapsed="0.000267"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:08.573050" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:08.572807" elapsed="0.000260"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:08.573360" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:08.573108" elapsed="0.000268"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:08.573675" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:08.573417" elapsed="0.000273"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:08.573996" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:08.573732" elapsed="0.000282"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:08.574302" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:08.574058" elapsed="0.000260"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:08.574629" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:08.574364" elapsed="0.000280"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:08.574944" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:08.574685" elapsed="0.000275"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:08.572088" elapsed="0.002886"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:08.575021" elapsed="0.000008"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:08.575068" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:08.575112" elapsed="0.000006"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:08.575154" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:08.575197" elapsed="0.000006"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:08.575238" elapsed="0.000024"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:08.575301" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:08.575344" elapsed="0.000006"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:08.575385" elapsed="0.000006"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:08.574983" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:08.571818" elapsed="0.003592"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:08.575503" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:08.575444" elapsed="0.000076"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:08.575673" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:08.575559" elapsed="0.000220"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:08.571636" elapsed="0.004169"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:08.575883" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:08.575848" elapsed="0.000050"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:08.570797" elapsed="0.005121"/>
</kw>
<test id="s1-s1-s1-t1" name="获取广告列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:08.576927" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:08.576645" elapsed="0.000295"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:08.577191" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:08.576991" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:08.576984" elapsed="0.000237"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:08.577235" elapsed="0.000015"/>
</return>
<msg time="2026-05-28T22:27:08.577318" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:08.576349" elapsed="0.000980"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:10.106349" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/app/public/ad/list 
 path_url=/v1/app/public/ad/list 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:10.106806" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/app/public/ad/list 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:10 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0440fc38169-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:10.106985" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:10.107448" level="INFO">${response} = &lt;Response [456]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>url=/v1/app/public/ad/list</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=any</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T22:27:08.577370" elapsed="1.530144"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.109596" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-05-28T22:27:10.109867" level="FAIL">456 != 200</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-05-28T22:27:10.108143" elapsed="0.001905">456 != 200</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${resp_json}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.110380" elapsed="0.000050"/>
</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="NOT RUN" start="2026-05-28T22:27:10.110667" elapsed="0.000039"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:10.111062" elapsed="0.000039"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.111334" elapsed="0.000037"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.111592" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:10.111850" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:10.112095" elapsed="0.000026"/>
</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="NOT RUN" start="2026-05-28T22:27:10.112306" elapsed="0.000027"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>获取广告列表 /v1/app/public/ad/list status=${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.112492" elapsed="0.000034"/>
</kw>
<doc>验证广告列表接口功能</doc>
<tag>app</tag>
<status status="FAIL" start="2026-05-28T22:27:08.575943" elapsed="1.536948">456 != 200</status>
</test>
<doc>广告列表接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:08.490184" elapsed="1.623587"/>
</suite>
<suite id="s1-s1-s2" name="App Share Info" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/app/app_share_info.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.121630" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:10.121372" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.122068" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:10.121795" elapsed="0.000336"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.122420" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:10.122262" elapsed="0.000213"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:10.122165" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:10.121761" elapsed="0.000778"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.123350" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:10.123217" elapsed="0.000181"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.123652" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.123780" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.123900" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.124021" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.124140" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:10.123468" elapsed="0.000732"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.126615" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:10.124381" elapsed="0.002282"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.126981" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:10.126785" elapsed="0.000232"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.127296" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:10.127117" elapsed="0.000213"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.127608" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:10.127426" elapsed="0.000216"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.127920" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:10.127737" elapsed="0.000220"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.128248" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:10.128053" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.128602" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:10.128388" elapsed="0.000250"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.128944" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:10.128742" elapsed="0.000237"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.129369" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:10.129167" elapsed="0.000236"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:10.124226" elapsed="0.005210"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:10.129563" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.129670" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.129780" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.129886" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.129990" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.130094" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.130190" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.130282" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.130374" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:10.129463" elapsed="0.000952"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:10.123449" elapsed="0.006983"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.130658" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:10.130511" elapsed="0.000187"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:10.131089" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:10.130783" elapsed="0.000529"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:10.122915" elapsed="0.008460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.131540" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:10.131468" elapsed="0.000105"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:10.121013" elapsed="0.010603"/>
</kw>
<test id="s1-s1-s2-t1" name="获取应用分享信息" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.134196" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:10.133575" elapsed="0.000647"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.135159" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:10.134338" elapsed="0.000919"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:10.134320" elapsed="0.000965"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:10.135330" elapsed="0.000039"/>
</return>
<msg time="2026-05-28T22:27:10.135616" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:10.132874" elapsed="0.002779"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:10.627430" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/app/public/app/share/info 
 path_url=/v1/app/public/app/share/info 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:10.627785" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/app/public/app/share/info 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:10 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0475d4efd48-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:10.628171" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:10.628512" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/app/share/info</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="FAIL" start="2026-05-28T22:27:10.136723" elapsed="0.505770">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/app/share/info</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:10.642794" elapsed="0.000071"/>
</return>
<var>${response}</var>
<arg>/v1/app/public/app/share/info</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="FAIL" start="2026-05-28T22:27:10.135855" elapsed="0.507295">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/app/share/info</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.643794" elapsed="0.000085"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.644199" elapsed="0.000054"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.644571" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.644963" elapsed="0.000046"/>
</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="NOT RUN" start="2026-05-28T22:27:10.645256" elapsed="0.000037"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:10.645582" elapsed="0.000038"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取应用分享信息</arg>
<arg>/v1/app/public/app/share/info</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.646001" elapsed="0.000047"/>
</kw>
<doc>验证应用分享信息接口功能</doc>
<tag>app</tag>
<status status="FAIL" start="2026-05-28T22:27:10.131684" elapsed="0.514864">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/app/share/info</status>
</test>
<doc>应用分享信息接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:10.115344" elapsed="0.532093"/>
</suite>
<suite id="s1-s1-s3" name="App Version Info" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/app/app_version_info.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.655447" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:10.655158" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.655882" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:10.655609" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.656259" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:10.656084" elapsed="0.000228"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:10.655979" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:10.655567" elapsed="0.000805"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.657158" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:10.657027" elapsed="0.000178"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.657443" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.657553" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.657664" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.657783" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.657893" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:10.657277" elapsed="0.000669"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.658321" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:10.658102" elapsed="0.000255"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.658643" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:10.658455" elapsed="0.000223"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.658966" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:10.658776" elapsed="0.000223"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.659345" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:10.659153" elapsed="0.000226"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.659656" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:10.659474" elapsed="0.000216"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.659965" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:10.659786" elapsed="0.000214"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.660296" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:10.660095" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.660625" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:10.660435" elapsed="0.000230"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.660961" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:10.660759" elapsed="0.000236"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:10.657968" elapsed="0.003058"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:10.661141" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.661242" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.661350" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.661455" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.661559" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.661654" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.661749" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.661838" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.661927" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:10.661050" elapsed="0.000918"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:10.657259" elapsed="0.004729"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.662220" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:10.662066" elapsed="0.000192"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:10.662693" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:10.662351" elapsed="0.000565"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:10.656736" elapsed="0.006246"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.663140" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:10.663071" elapsed="0.000102"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:10.654842" elapsed="0.008378"/>
</kw>
<test id="s1-s1-s3-t1" name="获取应用版本信息" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:10.666224" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:10.665206" elapsed="0.001069"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:10.667141" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:10.666453" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:10.666423" elapsed="0.000822"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:10.667343" elapsed="0.000035"/>
</return>
<msg time="2026-05-28T22:27:10.667635" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:10.664456" elapsed="0.003212"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:11.383174" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:11.383570" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/app/public/app-info/version?client=ios-test-flight&amp;build=7034 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:11 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df04c0c9ee37d-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:11.383798" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:11.384190" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/app-info/version?client=ios-test-flight&amp;build=7034</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="FAIL" start="2026-05-28T22:27:10.668751" elapsed="0.715907">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/app-info/version?client=ios-test-flight&amp;build=7034</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:11.384953" elapsed="0.000082"/>
</return>
<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="FAIL" start="2026-05-28T22:27:10.667867" elapsed="0.717447">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/app-info/version?client=ios-test-flight&amp;build=7034</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.386030" elapsed="0.000088"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.386440" elapsed="0.000052"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.386811" elapsed="0.000047"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取应用版本信息</arg>
<arg>/v1/app/public/app-info/version?client=ios-test-flight&amp;build=7034</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.387209" elapsed="0.000048"/>
</kw>
<doc>验证应用版本信息接口功能</doc>
<tag>app</tag>
<status status="FAIL" start="2026-05-28T22:27:10.663286" elapsed="0.724474">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/app-info/version?client=ios-test-flight&amp;build=7034</status>
</test>
<doc>应用版本信息接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:10.649330" elapsed="0.739312"/>
</suite>
<suite id="s1-s1-s4" name="Banner List" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/app/banner_list.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.398265" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:11.397949" elapsed="0.000355"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.398752" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:11.398433" elapsed="0.000384"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.399160" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:11.398968" elapsed="0.000254"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:11.398851" elapsed="0.000411"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:11.398395" elapsed="0.000896"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.400201" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:11.400055" 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-05-28T22:27:11.400556" elapsed="0.000022"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.400707" elapsed="0.000022"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.400853" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.401001" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.401144" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:11.400336" elapsed="0.000932"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.401709" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:11.401450" elapsed="0.000302"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.402078" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:11.401863" elapsed="0.000257"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.402450" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:11.402230" elapsed="0.000259"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.402809" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:11.402600" elapsed="0.000247"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.403167" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:11.402961" elapsed="0.000244"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.403569" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:11.403344" elapsed="0.000265"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.403947" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:11.403718" elapsed="0.000275"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.404323" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:11.404101" elapsed="0.000264"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.404703" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:11.404473" elapsed="0.000267"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:11.401293" elapsed="0.003483"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:11.404901" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.405029" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.405159" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.405270" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.405379" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.405489" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.405592" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.405694" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.405802" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:11.404802" elapsed="0.001057"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:11.400313" elapsed="0.005564"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.406115" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:11.405971" elapsed="0.000185"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:11.406636" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:11.406265" elapsed="0.000610"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:11.399715" elapsed="0.007226"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.407114" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:11.407037" elapsed="0.000115"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:11.397233" elapsed="0.009968"/>
</kw>
<test id="s1-s1-s4-t1" name="获取Banner列表" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.408413" level="INFO">&amp;{params} = { type=2 }</msg>
<var>&amp;{params}</var>
<arg>type=2</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:11.408188" elapsed="0.000249"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.410368" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:11.409449" elapsed="0.001027"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.411416" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:11.410675" elapsed="0.000820"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:11.410640" elapsed="0.000886"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:11.411567" elapsed="0.000037"/>
</return>
<msg time="2026-05-28T22:27:11.411822" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:11.408648" elapsed="0.003206"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:11.901163" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/app/public/banner/listByApp?type=2 
 path_url=/v1/app/public/banner/listByApp?type=2 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:11.901518" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/app/public/banner/listByApp?type=2 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:11 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df04f4846d78f-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:11.901684" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:11.902109" level="INFO">${response} = &lt;Response [456]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>url=/v1/app/public/banner/listByApp</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=any</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T22:27:11.411992" elapsed="0.490184"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.904222" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-05-28T22:27:11.904501" level="FAIL">456 != 200</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-05-28T22:27:11.902759" elapsed="0.001933">456 != 200</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${resp_json}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.905054" elapsed="0.000057"/>
</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="NOT RUN" start="2026-05-28T22:27:11.905364" elapsed="0.000041"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:11.905657" elapsed="0.000035"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.905945" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.906213" elapsed="0.000034"/>
</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="NOT RUN" start="2026-05-28T22:27:11.906480" elapsed="0.000035"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:11.906805" elapsed="0.000035"/>
</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="NOT RUN" start="2026-05-28T22:27:11.907078" elapsed="0.000034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>获取Banner列表 /v1/app/public/banner/listByApp status=${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.907344" elapsed="0.000034"/>
</kw>
<doc>验证Banner列表接口功能</doc>
<tag>app</tag>
<status status="FAIL" start="2026-05-28T22:27:11.407276" elapsed="0.500532">456 != 200</status>
</test>
<doc>Banner列表接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:11.390984" elapsed="0.517516"/>
</suite>
<suite id="s1-s1-s5" name="Captcha Apply" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/app/captcha_apply.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.916945" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:11.916680" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.917456" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:11.917185" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.917823" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:11.917661" elapsed="0.000223"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:11.917556" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:11.917152" elapsed="0.000795"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.918780" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:11.918649" elapsed="0.000177"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.919074" elapsed="0.000022"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.919208" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.919337" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.919463" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.919592" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:11.918895" elapsed="0.000748"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.920100" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:11.919830" elapsed="0.000313"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.920472" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:11.920256" elapsed="0.000257"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.920840" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:11.920622" elapsed="0.000257"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.921179" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:11.920992" elapsed="0.000221"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.921628" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:11.921308" elapsed="0.000355"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.921964" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:11.921767" elapsed="0.000231"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.922298" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:11.922096" elapsed="0.000237"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.922618" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:11.922426" elapsed="0.000225"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.922952" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:11.922746" elapsed="0.000242"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:11.919677" elapsed="0.003343"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:11.923137" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.923245" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.923353" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.923458" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.923560" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.923669" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.923774" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.923874" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.923975" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:11.923050" elapsed="0.001024"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:11.918877" elapsed="0.005217"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.924332" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:11.924180" elapsed="0.000193"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:11.924853" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:11.924474" elapsed="0.000622"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:11.918341" elapsed="0.006830"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.925353" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:11.925275" elapsed="0.000116"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:11.916326" elapsed="0.009114"/>
</kw>
<test id="s1-s1-s5-t1" name="申请验证码" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.926638" level="INFO">&amp;{params} = { type=2 }</msg>
<var>&amp;{params}</var>
<arg>type=2</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:11.926442" elapsed="0.000217"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:11.928135" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:11.927566" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:11.928738" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:11.928279" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:11.928257" elapsed="0.000549"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:11.928844" elapsed="0.000054"/>
</return>
<msg time="2026-05-28T22:27:11.929067" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:11.926865" elapsed="0.002224"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:12.414685" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/app/public/captcha/apply?type=2 
 path_url=/v1/app/public/captcha/apply?type=2 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:12.414940" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/app/public/captcha/apply?type=2 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:12 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0528eff8a36-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:12.415113" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:12.415376" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/captcha/apply?type=2</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="FAIL" start="2026-05-28T22:27:11.929577" elapsed="0.486148">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/captcha/apply?type=2</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:12.415912" elapsed="0.000050"/>
</return>
<var>${response}</var>
<arg>/v1/app/public/captcha/apply</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="FAIL" start="2026-05-28T22:27:11.929222" elapsed="0.486936">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/captcha/apply?type=2</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.416618" elapsed="0.000062"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.416955" elapsed="0.000049"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.417272" elapsed="0.000045"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>请求验证码</arg>
<arg>/v1/app/public/captcha/apply</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.417623" elapsed="0.000045"/>
</kw>
<doc>验证验证码请求接口功能</doc>
<tag>app</tag>
<status status="FAIL" start="2026-05-28T22:27:11.925518" elapsed="0.492570">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/captcha/apply?type=2</status>
</test>
<doc>验证码申请接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:11.910000" elapsed="0.508700"/>
</suite>
<suite id="s1-s1-s6" name="Open Screen List" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/app/open_screen_list.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:12.428055" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:12.427756" elapsed="0.000341"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.428522" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:12.428219" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:12.428974" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:12.428780" elapsed="0.000260"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:12.428638" elapsed="0.000452"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:12.428189" elapsed="0.000931"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:12.430105" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:12.429935" elapsed="0.000223"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.430421" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.430568" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.430711" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.430850" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.430987" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:12.430233" elapsed="0.000813"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:12.431500" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:12.431249" elapsed="0.000298"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:12.431910" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:12.431674" elapsed="0.000281"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:12.432328" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:12.432080" elapsed="0.000300"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:12.432777" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:12.432522" elapsed="0.000300"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:12.433190" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:12.432948" elapsed="0.000286"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:12.433606" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:12.433363" elapsed="0.000287"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:12.434042" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:12.433779" elapsed="0.000307"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:12.434459" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:12.434210" elapsed="0.000293"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:12.434828" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:12.434610" elapsed="0.000255"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:12.431073" elapsed="0.003827"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:12.435034" elapsed="0.000022"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.435161" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.435279" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.435399" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.435514" elapsed="0.000050"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.435669" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.435788" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.435903" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.436020" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:12.434932" elapsed="0.001138"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:12.430214" elapsed="0.005878"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:12.436350" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:12.436185" elapsed="0.000211"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:12.436789" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:12.436502" elapsed="0.000455"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:12.429561" elapsed="0.007465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:12.437223" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:12.437137" elapsed="0.000127"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:12.427401" elapsed="0.009917"/>
</kw>
<test id="s1-s1-s6-t1" name="获取开屏广告列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:12.440038" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:12.439409" elapsed="0.000655"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:12.440661" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:12.440179" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:12.440163" elapsed="0.000579"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:12.440776" elapsed="0.000027"/>
</return>
<msg time="2026-05-28T22:27:12.440959" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:12.438698" elapsed="0.002289"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:13.139107" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/app/public/open-screen/list 
 path_url=/v1/app/public/open-screen/list 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:13.139468" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/app/public/open-screen/list 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:13 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df056d895d503-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:13.139693" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:13.140089" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/open-screen/list</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="FAIL" start="2026-05-28T22:27:12.441873" elapsed="0.698712">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/open-screen/list</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:13.140859" elapsed="0.000082"/>
</return>
<var>${response}</var>
<arg>/v1/app/public/open-screen/list</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="FAIL" start="2026-05-28T22:27:12.441113" elapsed="0.700102">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/open-screen/list</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:13.141985" elapsed="0.000090"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T22:27:13.142380" elapsed="0.000049"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T22:27:13.142717" elapsed="0.000048"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取开屏广告列表</arg>
<arg>/v1/app/public/open-screen/list</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T22:27:13.143101" elapsed="0.000048"/>
</kw>
<doc>验证开屏广告列表接口功能</doc>
<tag>app</tag>
<status status="FAIL" start="2026-05-28T22:27:12.437380" elapsed="0.706228">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/open-screen/list</status>
</test>
<doc>开屏广告列表接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:12.420705" elapsed="0.723714"/>
</suite>
<suite id="s1-s1-s7" name="Open Screen List Lang" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/app/open_screen_list_lang.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:13.154536" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:13.154194" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:13.155015" elapsed="0.000293"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:13.154702" elapsed="0.000652"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:13.155704" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:13.155512" elapsed="0.000253"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:13.155388" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:13.154668" elapsed="0.001164"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:13.156714" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:13.156569" elapsed="0.000199"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:13.157083" elapsed="0.000026"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:13.157234" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:13.157378" elapsed="0.000022"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:13.157518" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:13.157662" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:13.156866" elapsed="0.000854"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:13.158207" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:13.157926" elapsed="0.000330"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:13.158632" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:13.158388" elapsed="0.000285"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:13.158987" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:13.158781" elapsed="0.000244"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:13.159343" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:13.159134" elapsed="0.000248"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:13.159699" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:13.159489" elapsed="0.000248"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:13.160051" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:13.159844" elapsed="0.000246"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:13.160437" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:13.160202" elapsed="0.000275"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:13.160814" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:13.160590" elapsed="0.000262"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:13.161189" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:13.160961" elapsed="0.000266"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:13.157748" elapsed="0.003515"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:13.161392" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:13.161573" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:13.161702" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:13.161825" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:13.161945" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:13.162063" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:13.162181" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:13.162298" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:13.162415" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:13.161291" elapsed="0.001174"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:13.156828" elapsed="0.005661"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:13.162768" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:13.162587" elapsed="0.000228"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:13.163255" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:13.162933" elapsed="0.000545"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:13.156237" elapsed="0.007310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:13.163725" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:13.163647" elapsed="0.000116"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:13.153727" elapsed="0.010085"/>
</kw>
<test id="s1-s1-s7-t1" name="获取开屏广告语言列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:13.166831" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:13.166143" 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-05-28T22:27:13.167804" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:13.167000" elapsed="0.000909"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:13.166979" elapsed="0.000960"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:13.167988" elapsed="0.000042"/>
</return>
<msg time="2026-05-28T22:27:13.168294" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:13.165339" elapsed="0.002990"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:15.969567" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/app/public/open-screen/list/lang 
 path_url=/v1/app/public/open-screen/list/lang 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:15.969970" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/app/public/open-screen/list/lang 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:15 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df068bf3aa0e3-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:15.970165" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:15.970564" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/open-screen/list/lang</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="FAIL" start="2026-05-28T22:27:13.169474" elapsed="2.801668">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/open-screen/list/lang</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:15.971421" elapsed="0.000086"/>
</return>
<var>${response}</var>
<arg>/v1/app/public/open-screen/list/lang</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="FAIL" start="2026-05-28T22:27:13.168542" elapsed="2.803234">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/open-screen/list/lang</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.972508" elapsed="0.000103"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.972917" elapsed="0.000048"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.973261" elapsed="0.000633"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.974242" elapsed="0.000045"/>
</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="NOT RUN" start="2026-05-28T22:27:15.974534" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:15.974834" elapsed="0.000036"/>
</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="NOT RUN" start="2026-05-28T22:27:15.975099" elapsed="0.000034"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取开屏广告语言列表</arg>
<arg>/v1/app/public/open-screen/list/lang</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.975507" elapsed="0.000048"/>
</kw>
<doc>验证开屏广告语言列表接口功能</doc>
<tag>app</tag>
<status status="FAIL" start="2026-05-28T22:27:13.163885" elapsed="2.812164">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/open-screen/list/lang</status>
</test>
<doc>开屏广告语言列表接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:13.146664" elapsed="2.830099"/>
</suite>
<suite id="s1-s1-s8" name="Vajra District" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/app/vajra_district.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:15.984552" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:15.984217" elapsed="0.000373"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.985049" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:15.984730" elapsed="0.000385"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:15.985430" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:15.985257" elapsed="0.000225"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:15.985150" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:15.984688" elapsed="0.000857"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:15.986476" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:15.986207" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.986783" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.986912" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.987035" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.987152" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.987274" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:15.986595" elapsed="0.000728"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:15.987759" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:15.987505" elapsed="0.000296"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:15.988138" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:15.987913" elapsed="0.000264"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:15.988485" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:15.988282" elapsed="0.000240"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:15.988847" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:15.988634" elapsed="0.000251"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:15.989220" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:15.988990" elapsed="0.000324"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:15.989628" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:15.989422" elapsed="0.000239"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:15.989958" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:15.989755" elapsed="0.000240"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:15.990369" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:15.990094" elapsed="0.000331"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:15.990796" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:15.990560" elapsed="0.000276"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:15.987348" elapsed="0.003526"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:15.991016" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.991132" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.991244" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.991349" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.991454" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.991558" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.991662" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.991765" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.991868" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:15.990905" elapsed="0.001007"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:15.986576" elapsed="0.005356"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:15.992223" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:15.992022" elapsed="0.000248"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:15.992700" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:15.992368" elapsed="0.000569"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:15.985911" elapsed="0.007100"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:15.993224" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:15.993135" elapsed="0.000129"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:15.983870" elapsed="0.009450"/>
</kw>
<test id="s1-s1-s8-t1" name="获取Vajra District列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:15.996352" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:15.995568" elapsed="0.000824"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:15.997178" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:15.996547" elapsed="0.000701"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:15.996523" elapsed="0.000751"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:15.997311" elapsed="0.000041"/>
</return>
<msg time="2026-05-28T22:27:15.997592" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:15.994594" elapsed="0.003030"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:15.998013" level="INFO">&amp;{params} = { version=new }</msg>
<var>&amp;{params}</var>
<arg>version=new</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:15.997801" elapsed="0.000241"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:16.804747" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/app/public/vajra-district/list?version=new 
 path_url=/v1/app/public/vajra-district/list?version=new 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:16.805080" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/app/public/vajra-district/list?version=new 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:16 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df06d786dd4f7-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:16.805268" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:16.805662" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/vajra-district/list?version=new</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="FAIL" start="2026-05-28T22:27:15.998644" elapsed="0.807532">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/vajra-district/list?version=new</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:16.806421" elapsed="0.000077"/>
</return>
<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="FAIL" start="2026-05-28T22:27:15.998208" elapsed="0.808546">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/vajra-district/list?version=new</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.807366" elapsed="0.000081"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.807760" elapsed="0.000049"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.808104" elapsed="0.000072"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取Vajra District列表</arg>
<arg>/v1/app/public/vajra-district/list</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.808522" elapsed="0.000048"/>
</kw>
<doc>验证Vajra District列表接口功能</doc>
<tag>app</tag>
<status status="FAIL" start="2026-05-28T22:27:15.993398" elapsed="0.815652">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/app/public/vajra-district/list?version=new</status>
</test>
<doc>Vajra District 接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:15.978641" elapsed="0.831223"/>
</suite>
<status status="FAIL" start="2026-05-28T22:27:08.489794" elapsed="8.322238"/>
</suite>
<suite id="s1-s2" name="Future-U" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u">
<suite id="s1-s2-s1" name="Market" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/market">
<suite id="s1-s2-s1-s1" name="Future U Symbol Detail" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/market/future_u_symbol_detail.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:16.824564" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:16.824263" elapsed="0.000343"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.825054" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:16.824744" elapsed="0.000379"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:16.825448" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:16.825273" elapsed="0.000239"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:16.825155" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:16.824708" elapsed="0.000867"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:16.828550" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:16.828409" elapsed="0.000192"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.828895" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.829022" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.829153" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.829285" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.829407" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:16.828683" elapsed="0.000835"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:16.829973" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:16.829705" elapsed="0.000300"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:16.830281" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:16.830088" elapsed="0.000223"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:16.830562" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:16.830395" elapsed="0.000197"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:16.830854" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:16.830677" elapsed="0.000206"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:16.831140" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:16.830970" elapsed="0.000199"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:16.831429" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:16.831252" elapsed="0.000206"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:16.831723" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:16.831541" elapsed="0.000211"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:16.832022" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:16.831837" elapsed="0.000214"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:16.832321" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:16.832139" elapsed="0.000211"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:16.829545" elapsed="0.002835"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:16.832479" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.832574" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.832667" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.832761" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.832851" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.832943" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.833047" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.833136" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.833224" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:16.832401" elapsed="0.000861"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:16.828663" elapsed="0.004618"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:16.833495" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:16.833359" elapsed="0.000171"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:16.833933" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:16.833626" elapsed="0.000530"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:16.828084" elapsed="0.006134"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:16.834573" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:16.834407" elapsed="0.000228"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:16.823889" elapsed="0.010817"/>
</kw>
<test id="s1-s2-s1-s1-t1" name="获取期货U本位交易对详情" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:16.836534" level="INFO">&amp;{params} = { symbol=btc_usdt }</msg>
<var>&amp;{params}</var>
<arg>symbol=btc_usdt</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:16.836312" elapsed="0.000253"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:16.838404" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:16.837655" elapsed="0.000815"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:16.839127" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:16.838618" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:16.838594" elapsed="0.000617"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:16.839246" elapsed="0.000028"/>
</return>
<msg time="2026-05-28T22:27:16.839434" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:16.836789" elapsed="0.002670"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:17.964453" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:17.964821" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/symbol/detail?symbol=btc_usdt 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:17 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df075293fd4a2-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:17.965042" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:17.965413" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/symbol/detail?symbol=btc_usdt</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="FAIL" start="2026-05-28T22:27:16.839976" elapsed="1.125927">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/symbol/detail?symbol=btc_usdt</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:17.966164" elapsed="0.000073"/>
</return>
<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="FAIL" start="2026-05-28T22:27:16.839591" elapsed="1.126919">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/symbol/detail?symbol=btc_usdt</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:17.967213" elapsed="0.000092"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T22:27:17.967610" elapsed="0.000048"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T22:27:17.967961" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:17.968379" elapsed="0.000050"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${data}</arg>
<arg>${None}</arg>
<arg>响应数据不应该为空</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:17.968685" elapsed="0.000039"/>
</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="NOT RUN" start="2026-05-28T22:27:17.968969" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:17.969286" elapsed="0.000034"/>
</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="NOT RUN" start="2026-05-28T22:27:17.969562" elapsed="0.000040"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取期货U本位交易对详情</arg>
<arg>/v1/future-u/market/public/symbol/detail</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T22:27:17.969998" elapsed="0.000047"/>
</kw>
<doc>验证期货U本位交易对详情接口功能</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:16.834782" elapsed="1.135722">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/symbol/detail?symbol=btc_usdt</status>
</test>
<test id="s1-s2-s1-s1-t2" name="获取期货U本位其他交易对详情" line="35">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:17.974812" level="INFO">&amp;{params} = { symbol=eth_usdt }</msg>
<var>&amp;{params}</var>
<arg>symbol=eth_usdt</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:17.973763" elapsed="0.001150"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:17.977273" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:17.976389" elapsed="0.000922"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:17.978289" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:17.977526" elapsed="0.000843"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:17.977478" elapsed="0.000933"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:17.978475" elapsed="0.000049"/>
</return>
<msg time="2026-05-28T22:27:17.978753" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:17.975260" elapsed="0.003525"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:18.091737" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:18.092104" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/symbol/detail?symbol=eth_usdt 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:18 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df075f9e5d4a2-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:18.092332" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:18.092741" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/symbol/detail?symbol=eth_usdt</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="FAIL" start="2026-05-28T22:27:17.979468" elapsed="0.113737">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/symbol/detail?symbol=eth_usdt</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:18.093477" elapsed="0.000071"/>
</return>
<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="FAIL" start="2026-05-28T22:27:17.978968" elapsed="0.114763">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/symbol/detail?symbol=eth_usdt</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.094267" elapsed="0.000055"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.094511" elapsed="0.000029"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.094725" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.095124" elapsed="0.000048"/>
</kw>
<kw name="Should Not Be Equal" owner="BuiltIn">
<arg>${data}</arg>
<arg>${None}</arg>
<arg>响应数据不应该为空</arg>
<doc>Fails if the given objects are equal.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.095418" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:18.095711" elapsed="0.000045"/>
</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="NOT RUN" start="2026-05-28T22:27:18.096032" elapsed="0.000036"/>
</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="NOT RUN" start="2026-05-28T22:27:18.096307" elapsed="0.000043"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取期货U本位其他交易对详情</arg>
<arg>/v1/future-u/market/public/symbol/detail</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.096724" elapsed="0.000050"/>
</kw>
<doc>验证期货U本位其他交易对详情接口功能</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:17.971037" elapsed="0.126225">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/symbol/detail?symbol=eth_usdt</status>
</test>
<doc>期货U本位交易对详情接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:16.818806" elapsed="1.279339"/>
</suite>
<status status="FAIL" start="2026-05-28T22:27:16.817149" elapsed="1.283526"/>
</suite>
<suite id="s1-s2-s2" name="Q" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/q">
<suite id="s1-s2-s2-s1" name="Future U Depth" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/q/future_u_depth.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:18.110419" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:18.110094" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.110900" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:18.110589" elapsed="0.000377"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:18.111306" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:18.111117" elapsed="0.000250"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:18.111005" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:18.110551" elapsed="0.000885"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:18.112320" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:18.112178" elapsed="0.000187"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.112629" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.112759" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.112885" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.113006" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.113125" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:18.112434" elapsed="0.000744"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:18.113618" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:18.113360" elapsed="0.000301"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:18.114003" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:18.113771" elapsed="0.000275"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:18.114375" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:18.114156" elapsed="0.000258"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:18.114750" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:18.114524" elapsed="0.000268"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:18.115139" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:18.114905" elapsed="0.000276"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:18.115535" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:18.115299" elapsed="0.000276"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:18.115934" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:18.115687" elapsed="0.000288"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:18.116323" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:18.116084" elapsed="0.000278"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:18.116723" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:18.116476" elapsed="0.000284"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:18.113203" elapsed="0.003588"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:18.116906" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.117002" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.117100" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.117192" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.117284" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.117429" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.117521" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.117612" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.117702" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:18.116815" elapsed="0.000926"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:18.112417" elapsed="0.005342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:18.118000" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:18.117838" elapsed="0.000202"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:18.118445" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:18.118133" elapsed="0.000542"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:18.111851" elapsed="0.006886"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:18.118900" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:18.118828" elapsed="0.000105"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:18.109740" elapsed="0.009236"/>
</kw>
<test id="s1-s2-s2-s1-t1" name="获取期货U本位深度数据_BTC" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:18.122159" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:18.121378" elapsed="0.000818"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:18.122950" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:18.122347" elapsed="0.000672"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:18.122324" elapsed="0.000721"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:18.123084" elapsed="0.000038"/>
</return>
<msg time="2026-05-28T22:27:18.123319" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:18.120433" elapsed="0.002915"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:19.231778" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:19.232136" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=btc_usdt&amp;level=100 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:19 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df07d19b3aff4-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:19.232335" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:19.232720" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=btc_usdt&amp;level=100</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="FAIL" start="2026-05-28T22:27:18.123957" elapsed="1.109279">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=btc_usdt&amp;level=100</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:19.233493" elapsed="0.000074"/>
</return>
<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="FAIL" start="2026-05-28T22:27:18.123527" elapsed="1.110318">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=btc_usdt&amp;level=100</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:19.234629" elapsed="0.000092"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:19.235040" elapsed="0.000049"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:19.235344" elapsed="0.000043"/>
</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="NOT RUN" start="2026-05-28T22:27:19.235627" elapsed="0.000039"/>
</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="NOT RUN" start="2026-05-28T22:27:19.235875" elapsed="0.000036"/>
</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="NOT RUN" start="2026-05-28T22:27:19.236124" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:19.236373" elapsed="0.000040"/>
</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="NOT RUN" start="2026-05-28T22:27:19.236619" elapsed="0.000034"/>
</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="NOT RUN" start="2026-05-28T22:27:19.236887" elapsed="0.000039"/>
</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="NOT RUN" start="2026-05-28T22:27:19.237165" elapsed="0.000036"/>
</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="NOT RUN" start="2026-05-28T22:27:19.237409" elapsed="0.000037"/>
</kw>
<doc>验证期货U本位深度数据接口功能（BTC/USDT）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:18.119045" elapsed="1.118895">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=btc_usdt&amp;level=100</status>
</test>
<test id="s1-s2-s2-s1-t2" name="获取期货U本位深度数据_ETH" line="27">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:19.243754" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:19.242698" elapsed="0.001101"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:19.244766" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:19.244003" elapsed="0.000845"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:19.243966" elapsed="0.000921"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:19.244942" elapsed="0.000047"/>
</return>
<msg time="2026-05-28T22:27:19.245239" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:19.241209" elapsed="0.004065"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:19.431913" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:19.432185" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=eth_usdt&amp;level=100 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:19 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df07dea44aff4-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:19.432342" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:19.432683" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=eth_usdt&amp;level=100</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="FAIL" start="2026-05-28T22:27:19.246063" elapsed="0.186998">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=eth_usdt&amp;level=100</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:19.433288" elapsed="0.000065"/>
</return>
<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="FAIL" start="2026-05-28T22:27:19.245498" elapsed="0.188160">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=eth_usdt&amp;level=100</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:19.434178" elapsed="0.000086"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:19.434554" elapsed="0.000040"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:19.434824" elapsed="0.000038"/>
</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="NOT RUN" start="2026-05-28T22:27:19.435098" elapsed="0.000035"/>
</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="NOT RUN" start="2026-05-28T22:27:19.435346" elapsed="0.000036"/>
</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="NOT RUN" start="2026-05-28T22:27:19.435588" elapsed="0.000041"/>
</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="NOT RUN" start="2026-05-28T22:27:19.435842" elapsed="0.000034"/>
</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="NOT RUN" start="2026-05-28T22:27:19.436098" elapsed="0.000034"/>
</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="NOT RUN" start="2026-05-28T22:27:19.436374" elapsed="0.000034"/>
</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="NOT RUN" start="2026-05-28T22:27:19.436629" elapsed="0.000034"/>
</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="NOT RUN" start="2026-05-28T22:27:19.436886" elapsed="0.000033"/>
</kw>
<doc>验证期货U本位深度数据接口功能（ETH/USDT）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:19.238527" elapsed="0.198739">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=eth_usdt&amp;level=100</status>
</test>
<test id="s1-s2-s2-s1-t3" name="获取期货U本位深度数据_SOL" line="47">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:19.442905" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:19.441693" elapsed="0.001261"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:19.444121" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:19.443187" elapsed="0.001030"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:19.443145" elapsed="0.001115"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:19.444321" elapsed="0.000047"/>
</return>
<msg time="2026-05-28T22:27:19.444652" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:19.440289" elapsed="0.004405"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:19.561160" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:19.561439" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=sol_usdt&amp;level=100 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:19 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df07f2b59aff4-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:19.561634" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:19.561939" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=sol_usdt&amp;level=100</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="FAIL" start="2026-05-28T22:27:19.445539" elapsed="0.116809">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=sol_usdt&amp;level=100</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:19.562646" elapsed="0.000061"/>
</return>
<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="FAIL" start="2026-05-28T22:27:19.444929" elapsed="0.118020">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=sol_usdt&amp;level=100</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:19.563505" elapsed="0.000073"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:19.563862" elapsed="0.000045"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:19.564145" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:19.564425" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:19.564673" elapsed="0.000034"/>
</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="NOT RUN" start="2026-05-28T22:27:19.564921" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:19.565162" elapsed="0.000034"/>
</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="NOT RUN" start="2026-05-28T22:27:19.565408" elapsed="0.000034"/>
</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="NOT RUN" start="2026-05-28T22:27:19.565690" elapsed="0.000034"/>
</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="NOT RUN" start="2026-05-28T22:27:19.565957" elapsed="0.000038"/>
</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="NOT RUN" start="2026-05-28T22:27:19.566189" elapsed="0.000034"/>
</kw>
<doc>验证期货U本位深度数据接口功能（SOL/USDT）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:19.437694" elapsed="0.128854">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=sol_usdt&amp;level=100</status>
</test>
<test id="s1-s2-s2-s1-t4" name="获取期货U本位深度数据_不同深度级别" line="67">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:19.572471" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:19.571491" elapsed="0.001023"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:19.573471" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:19.572712" elapsed="0.000837"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:19.572672" elapsed="0.000916"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:19.573635" elapsed="0.000040"/>
</return>
<msg time="2026-05-28T22:27:19.573906" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:19.570271" elapsed="0.003669"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:19.983106" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:19.983493" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=btc_usdt&amp;level=1000 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:19 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df07ffc06aff4-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:19.983701" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:19.984094" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=btc_usdt&amp;level=1000</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="FAIL" start="2026-05-28T22:27:19.574657" elapsed="0.410009">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=btc_usdt&amp;level=1000</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:19.984943" elapsed="0.000093"/>
</return>
<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="FAIL" start="2026-05-28T22:27:19.574137" elapsed="0.411184">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=btc_usdt&amp;level=1000</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:19.986037" elapsed="0.000092"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:19.986462" elapsed="0.000045"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:19.986756" elapsed="0.000042"/>
</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="NOT RUN" start="2026-05-28T22:27:19.987035" elapsed="0.000039"/>
</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="NOT RUN" start="2026-05-28T22:27:19.987296" elapsed="0.000034"/>
</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="NOT RUN" start="2026-05-28T22:27:19.987568" elapsed="0.000038"/>
</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="NOT RUN" start="2026-05-28T22:27:19.987822" elapsed="0.000035"/>
</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="NOT RUN" start="2026-05-28T22:27:19.988062" elapsed="0.000035"/>
</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="NOT RUN" start="2026-05-28T22:27:19.988364" elapsed="0.000035"/>
</kw>
<doc>验证期货U本位深度数据接口不同深度级别功能</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:19.566943" elapsed="0.421987">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=btc_usdt&amp;level=1000</status>
</test>
<test id="s1-s2-s2-s1-t5" name="获取期货U本位深度数据_无效交易对" line="84">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:19.995045" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:19.994141" elapsed="0.000948"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:19.995995" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:19.995291" elapsed="0.000776"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:19.995255" elapsed="0.000844"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:19.996147" elapsed="0.000044"/>
</return>
<msg time="2026-05-28T22:27:19.996409" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:19.992842" elapsed="0.003597"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:20.515826" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:20.516212" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=invalid_pair&amp;level=100 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:20 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0829dc2aff4-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:20.516459" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:20.516838" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=invalid_pair&amp;level=100</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="FAIL" start="2026-05-28T22:27:19.997108" elapsed="0.520324">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=invalid_pair&amp;level=100</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:20.517710" elapsed="0.000104"/>
</return>
<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="FAIL" start="2026-05-28T22:27:19.996633" elapsed="0.521457">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=invalid_pair&amp;level=100</status>
</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="NOT RUN" start="2026-05-28T22:27:20.518635" elapsed="0.000056"/>
</kw>
<doc>验证期货U本位深度数据接口错误处理（无效交易对）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:19.989515" elapsed="0.529659">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?symbol=invalid_pair&amp;level=100</status>
</test>
<test id="s1-s2-s2-s1-t6" name="获取期货U本位深度数据_缺少参数" line="92">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:20.527244" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:20.525981" elapsed="0.001317"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:20.528543" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:20.527560" elapsed="0.001094"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:20.527509" elapsed="0.001189"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:20.528759" elapsed="0.000050"/>
</return>
<msg time="2026-05-28T22:27:20.529057" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:20.524442" elapsed="0.004650"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:20.643186" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/future-u/market/public/q/depth?level=100 
 path_url=/v1/future-u/market/public/q/depth?level=100 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:20.643454" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/depth?level=100 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:20 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df085efeeaff4-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:20.643610" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:20.643902" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?level=100</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="FAIL" start="2026-05-28T22:27:20.529874" elapsed="0.114409">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?level=100</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:20.644503" elapsed="0.000071"/>
</return>
<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="FAIL" start="2026-05-28T22:27:20.529322" elapsed="0.115482">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?level=100</status>
</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="NOT RUN" start="2026-05-28T22:27:20.645187" elapsed="0.000049"/>
</kw>
<doc>验证期货U本位深度数据接口参数验证（缺少symbol参数）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:20.519755" elapsed="0.125882">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/depth?level=100</status>
</test>
<doc>期货U本位深度数据接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:18.104170" elapsed="2.542282"/>
</suite>
<suite id="s1-s2-s2-s2" name="Future U Funding Rate" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/q/future_u_funding_rate.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:20.657262" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:20.656969" elapsed="0.000379"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:20.657789" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:20.657470" elapsed="0.000385"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:20.658197" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:20.658005" elapsed="0.000252"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:20.657888" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:20.657437" elapsed="0.000896"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:20.659266" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:20.659116" elapsed="0.000203"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:20.659615" elapsed="0.000024"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:20.659766" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:20.659913" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:20.660063" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:20.660201" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:20.659401" elapsed="0.000865"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:20.660766" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:20.660470" elapsed="0.000344"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:20.661217" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:20.660945" elapsed="0.000323"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:20.661620" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:20.661383" elapsed="0.000278"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:20.662015" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:20.661773" elapsed="0.000283"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:20.662388" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:20.662172" elapsed="0.000253"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:20.662778" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:20.662533" elapsed="0.000297"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:20.663180" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:20.662941" elapsed="0.000279"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:20.663569" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:20.663335" elapsed="0.000273"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:20.663955" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:20.663714" elapsed="0.000286"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:20.660294" elapsed="0.003741"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:20.664162" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:20.664289" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:20.664409" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:20.664531" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:20.664671" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:20.664788" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:20.664906" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:20.665021" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:20.665199" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:20.664061" elapsed="0.001189"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:20.659379" elapsed="0.005892"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:20.665535" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:20.665369" elapsed="0.000211"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:20.666041" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:20.665689" elapsed="0.000581"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:20.658788" elapsed="0.007552"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:20.666512" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:20.666437" elapsed="0.000112"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:20.656590" elapsed="0.010006"/>
</kw>
<test id="s1-s2-s2-s2-t1" name="获取期货U本位资金费率_BTC" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:20.669663" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:20.668981" elapsed="0.000709"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:20.670304" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:20.669818" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:20.669798" elapsed="0.000575"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:20.670400" elapsed="0.000035"/>
</return>
<msg time="2026-05-28T22:27:20.670585" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:20.668188" elapsed="0.002419"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:21.382222" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:21.382642" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=btc_usdt 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:21 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df088d8ec8a7b-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:21.382892" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:21.383297" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=btc_usdt</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="FAIL" start="2026-05-28T22:27:20.671057" elapsed="0.712790">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=btc_usdt</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:21.384155" elapsed="0.000099"/>
</return>
<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="FAIL" start="2026-05-28T22:27:20.670733" elapsed="0.713817">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=btc_usdt</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.385292" elapsed="0.000084"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.385723" elapsed="0.000053"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.386026" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:21.386417" elapsed="0.000042"/>
</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="NOT RUN" start="2026-05-28T22:27:21.386684" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:21.386930" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:21.387176" elapsed="0.000034"/>
</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="NOT RUN" start="2026-05-28T22:27:21.387428" elapsed="0.000042"/>
</kw>
<doc>验证期货U本位资金费率接口功能（BTC/USDT）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:20.666670" elapsed="0.721320">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=btc_usdt</status>
</test>
<test id="s1-s2-s2-s2-t2" name="获取期货U本位资金费率_ETH" line="21">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.395123" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:21.393823" elapsed="0.001355"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.396368" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:21.395443" elapsed="0.001018"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:21.395397" elapsed="0.001112"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:21.396583" elapsed="0.000059"/>
</return>
<msg time="2026-05-28T22:27:21.396918" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:21.392213" elapsed="0.004748"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:21.527554" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:21.527835" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=eth_usdt 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:21 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df08b5a9d8a7b-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:21.527994" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:21.528332" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=eth_usdt</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="FAIL" start="2026-05-28T22:27:21.397697" elapsed="0.131026">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=eth_usdt</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:21.528967" elapsed="0.000072"/>
</return>
<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="FAIL" start="2026-05-28T22:27:21.397175" elapsed="0.132102">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=eth_usdt</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.529830" elapsed="0.000090"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.530205" elapsed="0.000042"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.530496" elapsed="0.000040"/>
</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="NOT RUN" start="2026-05-28T22:27:21.530763" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:21.531019" elapsed="0.000036"/>
</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="NOT RUN" start="2026-05-28T22:27:21.531356" elapsed="0.000036"/>
</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="NOT RUN" start="2026-05-28T22:27:21.531595" elapsed="0.000035"/>
</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="NOT RUN" start="2026-05-28T22:27:21.531855" elapsed="0.000034"/>
</kw>
<doc>验证期货U本位资金费率接口功能（ETH/USDT）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:21.388596" elapsed="0.143711">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=eth_usdt</status>
</test>
<test id="s1-s2-s2-s2-t3" name="获取期货U本位资金费率_SOL" line="35">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.539726" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:21.538145" elapsed="0.001647"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.541356" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:21.540105" elapsed="0.001383"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:21.540050" elapsed="0.001495"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:21.541623" elapsed="0.000069"/>
</return>
<msg time="2026-05-28T22:27:21.542059" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:21.536292" elapsed="0.005825"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:21.655855" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:21.656149" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=sol_usdt 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:21 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df08c4b488a7b-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:21.656359" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:21.656690" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=sol_usdt</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="FAIL" start="2026-05-28T22:27:21.542881" elapsed="0.114224">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=sol_usdt</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:21.657347" elapsed="0.000068"/>
</return>
<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="FAIL" start="2026-05-28T22:27:21.542372" elapsed="0.115296">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=sol_usdt</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.658274" elapsed="0.000074"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.658638" elapsed="0.000045"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.658922" elapsed="0.000040"/>
</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="NOT RUN" start="2026-05-28T22:27:21.659201" elapsed="0.000038"/>
</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="NOT RUN" start="2026-05-28T22:27:21.659446" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:21.659698" elapsed="0.000034"/>
</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="NOT RUN" start="2026-05-28T22:27:21.660019" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:21.660265" elapsed="0.000036"/>
</kw>
<doc>验证期货U本位资金费率接口功能（SOL/USDT）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:21.532839" elapsed="0.127862">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=sol_usdt</status>
</test>
<test id="s1-s2-s2-s2-t4" name="获取期货U本位资金费率_无效交易对" line="49">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.669157" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:21.667838" elapsed="0.001368"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.670384" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:21.669456" elapsed="0.001027"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:21.669411" elapsed="0.001121"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:21.670591" elapsed="0.000052"/>
</return>
<msg time="2026-05-28T22:27:21.670943" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:21.665938" elapsed="0.005048"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:21.784639" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:21.784962" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=invalid_symbol 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:21 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df08d1bdc8a7b-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:21.785119" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:21.785377" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=invalid_symbol</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="FAIL" start="2026-05-28T22:27:21.671879" elapsed="0.113839">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=invalid_symbol</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:21.785931" elapsed="0.000069"/>
</return>
<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="FAIL" start="2026-05-28T22:27:21.671233" elapsed="0.114991">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=invalid_symbol</status>
</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="NOT RUN" start="2026-05-28T22:27:21.786635" elapsed="0.000046"/>
</kw>
<doc>验证期货U本位资金费率接口错误处理（无效交易对）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:21.661251" elapsed="0.125803">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate?symbol=invalid_symbol</status>
</test>
<test id="s1-s2-s2-s2-t5" name="获取期货U本位资金费率_缺少参数" line="56">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.793019" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:21.792030" elapsed="0.001027"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.794265" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:21.793504" elapsed="0.000839"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:21.793461" elapsed="0.000916"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:21.794428" elapsed="0.000042"/>
</return>
<msg time="2026-05-28T22:27:21.794705" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:21.790687" elapsed="0.004048"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:21.906452" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate 
 path_url=/v1/future-u/market/public/q/funding-rate 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:21.906702" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:21 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df08ddc858a7b-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:21.906890" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:21.907182" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate</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="FAIL" start="2026-05-28T22:27:21.795792" elapsed="0.111784">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:21.907796" elapsed="0.000056"/>
</return>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/funding-rate</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="FAIL" start="2026-05-28T22:27:21.794939" elapsed="0.113132">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate</status>
</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="NOT RUN" start="2026-05-28T22:27:21.908449" elapsed="0.000047"/>
</kw>
<doc>验证期货U本位资金费率接口参数验证（缺少symbol参数）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:21.787506" elapsed="0.121450">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/funding-rate</status>
</test>
<doc>期货U本位资金费率接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:20.649095" elapsed="1.260734"/>
</suite>
<suite id="s1-s2-s2-s3" name="Future U Index Price" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/q/future_u_index_price.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.921047" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:21.920688" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.921584" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:21.921245" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.921988" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:21.921804" elapsed="0.000242"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:21.921689" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:21.921206" elapsed="0.000909"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.923010" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:21.922871" elapsed="0.000191"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.923351" elapsed="0.000022"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.923519" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.923660" elapsed="0.000022"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.923802" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.923943" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:21.923139" elapsed="0.000877"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.924639" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:21.924320" elapsed="0.000368"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.925109" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:21.924817" elapsed="0.000337"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.925750" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:21.925279" elapsed="0.000512"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.926143" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:21.925902" elapsed="0.000279"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.926547" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:21.926304" elapsed="0.000286"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.926946" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:21.926707" elapsed="0.000277"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.927339" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:21.927093" elapsed="0.000285"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.927722" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:21.927486" elapsed="0.000276"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.928112" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:21.927871" elapsed="0.000281"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:21.924119" elapsed="0.004069"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:21.928321" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.928443" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.928564" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.928681" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.928815" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.928937" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.929055" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.929170" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.929292" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:21.928219" elapsed="0.001131"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:21.923119" elapsed="0.006254"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.929650" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:21.929475" elapsed="0.000222"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:21.930133" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:21.929815" elapsed="0.000519"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:21.922535" elapsed="0.007864"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.930569" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:21.930493" elapsed="0.000108"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:21.920268" elapsed="0.010376"/>
</kw>
<test id="s1-s2-s2-s3-t1" name="获取期货U本位所有指数价格" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:21.933473" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:21.932863" elapsed="0.000634"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:21.934111" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:21.933645" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:21.933628" elapsed="0.000654"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:21.934342" elapsed="0.000050"/>
</return>
<msg time="2026-05-28T22:27:21.934655" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:21.932131" elapsed="0.002557"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:23.205996" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/future-u/market/public/q/index-price 
 path_url=/v1/future-u/market/public/q/index-price 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:23.206364" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/index-price 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:23 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df095eccd268a-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:23.206531" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:23.206889" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/index-price</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="FAIL" start="2026-05-28T22:27:21.935820" elapsed="1.271540">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/index-price</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:23.207599" elapsed="0.000068"/>
</return>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/index-price</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="FAIL" start="2026-05-28T22:27:21.934912" elapsed="1.272991">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/index-price</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:23.208499" elapsed="0.000083"/>
</kw>
<kw name="验证指数价格数据不为空">
<arg>${response.json()}</arg>
<status status="NOT RUN" start="2026-05-28T22:27:23.208911" elapsed="0.000050"/>
</kw>
<kw name="验证指数价格列表格式">
<arg>${response.json()['data']}</arg>
<status status="NOT RUN" start="2026-05-28T22:27:23.209312" elapsed="0.000046"/>
</kw>
<doc>测试获取所有期货U本位指数价格</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:21.930723" elapsed="1.279040">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/index-price</status>
</test>
<test id="s1-s2-s2-s3-t2" name="获取期货U本位单个指数价格" line="16">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:23.213576" level="INFO">${params} = {'symbol': 'btc_usdt'}</msg>
<var>${params}</var>
<arg>symbol=btc_usdt</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:23.213165" elapsed="0.000451"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:23.216347" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:23.215323" elapsed="0.001060"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:23.217282" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:23.216568" elapsed="0.000787"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:23.216531" elapsed="0.000856"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:23.217433" elapsed="0.000042"/>
</return>
<msg time="2026-05-28T22:27:23.217689" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:23.213977" elapsed="0.003745"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:23.334501" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:23.334922" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/index-price?symbol=btc_usdt 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:23 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df096bd52268a-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:23.335136" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:23.335402" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/index-price?symbol=btc_usdt</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="FAIL" start="2026-05-28T22:27:23.218859" elapsed="0.116938">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/index-price?symbol=btc_usdt</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:23.336013" elapsed="0.000064"/>
</return>
<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="FAIL" start="2026-05-28T22:27:23.217901" elapsed="0.118428">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/index-price?symbol=btc_usdt</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:23.336916" elapsed="0.000083"/>
</kw>
<kw name="验证指数价格数据不为空">
<arg>${response.json()}</arg>
<status status="NOT RUN" start="2026-05-28T22:27:23.337304" elapsed="0.000047"/>
</kw>
<kw name="验证指数价格列表格式">
<arg>${response.json()['data']}</arg>
<status status="NOT RUN" start="2026-05-28T22:27:23.337685" elapsed="0.000045"/>
</kw>
<kw name="验证单个指数价格符号">
<arg>${response.json()['data']}</arg>
<arg>btc_usdt</arg>
<status status="NOT RUN" start="2026-05-28T22:27:23.338002" elapsed="0.000051"/>
</kw>
<doc>测试获取单个期货U本位指数价格</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:23.210308" elapsed="0.128174">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/index-price?symbol=btc_usdt</status>
</test>
<test id="s1-s2-s2-s3-t3" name="获取期货U本位符号指数价格_BTC" line="27">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:23.342525" level="INFO">${params} = {'symbol': 'btc_usdt'}</msg>
<var>${params}</var>
<arg>symbol=btc_usdt</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:23.342150" elapsed="0.000419"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:23.345393" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:23.344283" elapsed="0.001167"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:23.346447" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:23.345690" elapsed="0.000833"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:23.345646" elapsed="0.000914"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:23.346611" elapsed="0.000043"/>
</return>
<msg time="2026-05-28T22:27:23.346868" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:23.342923" elapsed="0.003983"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:23.464127" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:23.464486" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=btc_usdt 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:23 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0978ddd268a-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:23.464795" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:23.465134" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=btc_usdt</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="FAIL" start="2026-05-28T22:27:23.347657" elapsed="0.117920">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=btc_usdt</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:23.465852" elapsed="0.000079"/>
</return>
<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="FAIL" start="2026-05-28T22:27:23.347095" elapsed="0.119095">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=btc_usdt</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:23.466908" elapsed="0.000096"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:23.467331" elapsed="0.000042"/>
</kw>
<kw name="验证符号指数价格数据结构">
<arg>${data}</arg>
<status status="NOT RUN" start="2026-05-28T22:27:23.467686" elapsed="0.000046"/>
</kw>
<kw name="验证符号指数价格符号">
<arg>${data['s']}</arg>
<arg>btc_usdt</arg>
<status status="NOT RUN" start="2026-05-28T22:27:23.468009" elapsed="0.000042"/>
</kw>
<kw name="验证符号指数价格价格格式">
<arg>${data['p']}</arg>
<status status="NOT RUN" start="2026-05-28T22:27:23.468300" elapsed="0.000047"/>
</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="NOT RUN" start="2026-05-28T22:27:23.468582" elapsed="0.000039"/>
</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="NOT RUN" start="2026-05-28T22:27:23.468837" elapsed="0.000035"/>
</kw>
<doc>测试获取BTC期货U本位符号指数价格</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:23.339026" elapsed="0.130330">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=btc_usdt</status>
</test>
<test id="s1-s2-s2-s3-t4" name="获取期货U本位符号指数价格_ETH" line="41">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:23.473752" level="INFO">${params} = {'symbol': 'eth_usdt'}</msg>
<var>${params}</var>
<arg>symbol=eth_usdt</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:23.473316" elapsed="0.000472"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:23.478989" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:23.478043" elapsed="0.000989"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:23.479984" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:23.479243" elapsed="0.000817"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:23.479200" elapsed="0.000893"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:23.480149" elapsed="0.000047"/>
</return>
<msg time="2026-05-28T22:27:23.480421" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:23.474108" elapsed="0.006347"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:23.625175" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:23.625448" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=eth_usdt 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:23 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0985e74268a-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:23.625755" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:23.626014" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=eth_usdt</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="FAIL" start="2026-05-28T22:27:23.481218" elapsed="0.145162">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=eth_usdt</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:23.626590" elapsed="0.000057"/>
</return>
<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="FAIL" start="2026-05-28T22:27:23.480667" elapsed="0.146194">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=eth_usdt</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:23.627393" elapsed="0.000075"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:23.627756" elapsed="0.000044"/>
</kw>
<kw name="验证符号指数价格数据结构">
<arg>${data}</arg>
<status status="NOT RUN" start="2026-05-28T22:27:23.628108" elapsed="0.000046"/>
</kw>
<kw name="验证符号指数价格符号">
<arg>${data['s']}</arg>
<arg>eth_usdt</arg>
<status status="NOT RUN" start="2026-05-28T22:27:23.628412" elapsed="0.000042"/>
</kw>
<kw name="验证符号指数价格价格格式">
<arg>${data['p']}</arg>
<status status="NOT RUN" start="2026-05-28T22:27:23.628706" elapsed="0.000041"/>
</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="NOT RUN" start="2026-05-28T22:27:23.628964" elapsed="0.000035"/>
</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="NOT RUN" start="2026-05-28T22:27:23.629209" elapsed="0.000034"/>
</kw>
<doc>测试获取ETH期货U本位符号指数价格</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:23.469913" elapsed="0.159756">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=eth_usdt</status>
</test>
<test id="s1-s2-s2-s3-t5" name="获取期货U本位符号指数价格_SOL" line="55">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:23.633988" level="INFO">${params} = {'symbol': 'sol_usdt'}</msg>
<var>${params}</var>
<arg>symbol=sol_usdt</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:23.633594" elapsed="0.000440"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:23.636857" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:23.635762" elapsed="0.001143"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:23.638074" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:23.637155" elapsed="0.001011"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:23.637113" elapsed="0.001100"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:23.638267" elapsed="0.000049"/>
</return>
<msg time="2026-05-28T22:27:23.638591" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:23.634405" elapsed="0.004228"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:23.755006" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:23.755289" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=sol_usdt 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:23 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0995f2d268a-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:23.755553" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:23.755810" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=sol_usdt</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="FAIL" start="2026-05-28T22:27:23.639551" elapsed="0.116658">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=sol_usdt</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:23.756446" elapsed="0.000065"/>
</return>
<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="FAIL" start="2026-05-28T22:27:23.638867" elapsed="0.117879">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=sol_usdt</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:23.757313" elapsed="0.000079"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${data}</var>
<arg>${response.json()['data']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:23.757686" elapsed="0.000041"/>
</kw>
<kw name="验证符号指数价格数据结构">
<arg>${data}</arg>
<status status="NOT RUN" start="2026-05-28T22:27:23.758040" elapsed="0.000050"/>
</kw>
<kw name="验证符号指数价格符号">
<arg>${data['s']}</arg>
<arg>sol_usdt</arg>
<status status="NOT RUN" start="2026-05-28T22:27:23.758353" elapsed="0.000049"/>
</kw>
<kw name="验证符号指数价格价格格式">
<arg>${data['p']}</arg>
<status status="NOT RUN" start="2026-05-28T22:27:23.758658" elapsed="0.000044"/>
</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="NOT RUN" start="2026-05-28T22:27:23.758933" elapsed="0.000038"/>
</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="NOT RUN" start="2026-05-28T22:27:23.759184" elapsed="0.000035"/>
</kw>
<doc>测试获取SOL期货U本位符号指数价格</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:23.630351" elapsed="0.129328">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=sol_usdt</status>
</test>
<test id="s1-s2-s2-s3-t6" name="获取期货U本位符号指数价格_无效交易对" line="69">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:23.764849" level="INFO">${params} = {'symbol': 'invalid_pair'}</msg>
<var>${params}</var>
<arg>symbol=invalid_pair</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:23.764310" elapsed="0.000600"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:23.768375" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:23.767282" elapsed="0.001138"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:23.769571" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:23.768652" elapsed="0.001013"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:23.768608" elapsed="0.001101"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:23.769766" elapsed="0.000053"/>
</return>
<msg time="2026-05-28T22:27:23.770096" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:23.765374" elapsed="0.004764"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:23.885384" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:23.885727" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=invalid_pair 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:23 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df09a2fc6268a-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:23.886041" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:23.886357" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=invalid_pair</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="FAIL" start="2026-05-28T22:27:23.770908" elapsed="0.115898">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=invalid_pair</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:23.887077" elapsed="0.000091"/>
</return>
<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="FAIL" start="2026-05-28T22:27:23.770348" elapsed="0.117102">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=invalid_pair</status>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:23.887947" elapsed="0.000052"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${response_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:23.888260" elapsed="0.000039"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:23.888512" elapsed="0.000036"/>
</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="NOT RUN" start="2026-05-28T22:27:23.888797" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:23.889061" elapsed="0.000036"/>
</kw>
<doc>测试获取无效交易对的符号指数价格</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:23.760235" elapsed="0.129379">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price?symbol=invalid_pair</status>
</test>
<test id="s1-s2-s2-s3-t7" name="获取期货U本位符号指数价格_缺少参数" line="81">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:23.897857" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:23.896350" elapsed="0.001557"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:23.899098" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:23.898156" elapsed="0.001040"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:23.898112" elapsed="0.001123"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:23.899294" elapsed="0.000050"/>
</return>
<msg time="2026-05-28T22:27:23.899652" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:23.894462" elapsed="0.005235"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:24.017231" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price 
 path_url=/v1/future-u/market/public/q/symbol-index-price 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:24.017578" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:24 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df09b088a268a-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:24.017749" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:24.018277" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price</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="FAIL" start="2026-05-28T22:27:23.901134" elapsed="0.117619">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:24.018992" elapsed="0.000071"/>
</return>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/symbol-index-price</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="FAIL" start="2026-05-28T22:27:23.899969" elapsed="0.119332">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price</status>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:24.019750" elapsed="0.000064"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${response_data}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:24.020071" elapsed="0.000041"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:24.020325" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:24.020595" elapsed="0.000035"/>
</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="NOT RUN" start="2026-05-28T22:27:24.020846" elapsed="0.000036"/>
</kw>
<doc>测试缺少symbol参数的符号指数价格请求</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:23.890194" elapsed="0.131122">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-index-price</status>
</test>
<doc>期货U本位指数价格接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:21.912569" elapsed="2.109523"/>
</suite>
<suite id="s1-s2-s2-s4" name="Future U Mark Price" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/q/future_u_mark_price.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:24.030041" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:24.029752" elapsed="0.000326"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:24.030500" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:24.030199" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:24.030894" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:24.030720" elapsed="0.000231"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:24.030603" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:24.030167" elapsed="0.000850"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:24.031825" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:24.031712" 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-05-28T22:27:24.032077" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:24.032189" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:24.032294" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:24.032399" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:24.032504" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:24.031923" elapsed="0.000628"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:24.032940" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:24.032708" elapsed="0.000275"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:24.033318" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:24.033091" elapsed="0.000268"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:24.033689" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:24.033471" elapsed="0.000256"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:24.034061" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:24.033837" elapsed="0.000263"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:24.034427" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:24.034206" elapsed="0.000260"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:24.034868" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:24.034644" elapsed="0.000261"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:24.035255" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:24.035012" elapsed="0.000283"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:24.035652" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:24.035411" elapsed="0.000281"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:24.036027" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:24.035806" elapsed="0.000254"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:24.032573" elapsed="0.003519"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:24.036208" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:24.036314" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:24.036419" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:24.036521" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:24.036622" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:24.036723" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:24.036825" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:24.036949" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:24.037067" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:24.036118" elapsed="0.000998"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:24.031907" elapsed="0.005230"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:24.037395" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:24.037235" elapsed="0.000200"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:24.037855" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:24.037538" elapsed="0.000530"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:24.031394" elapsed="0.006742"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:24.038313" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:24.038233" elapsed="0.000117"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:24.029410" elapsed="0.008990"/>
</kw>
<test id="s1-s2-s2-s4-t1" name="获取期货U本位标记价格" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:24.041342" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:24.040685" elapsed="0.000684"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:24.042301" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:24.041489" elapsed="0.000911"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:24.041470" elapsed="0.000959"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:24.042474" elapsed="0.000040"/>
</return>
<msg time="2026-05-28T22:27:24.042768" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:24.039904" elapsed="0.002900"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:25.988249" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/future-u/market/public/q/mark-price 
 path_url=/v1/future-u/market/public/q/mark-price 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:25.988869" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/mark-price 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:25 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0a75e94b568-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:25.989144" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:25.989496" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/mark-price</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="FAIL" start="2026-05-28T22:27:24.044090" elapsed="1.945874">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/mark-price</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:25.990246" elapsed="0.000081"/>
</return>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/mark-price</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="FAIL" start="2026-05-28T22:27:24.043013" elapsed="1.947603">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/mark-price</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:25.991289" elapsed="0.000092"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:25.991737" elapsed="0.000054"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${data}</arg>
<arg>响应数据不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:25.992035" elapsed="0.000041"/>
</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="NOT RUN" start="2026-05-28T22:27:25.992299" elapsed="0.000038"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<var>${length}</var>
<arg>${data}</arg>
<doc>Returns and logs the length of the given item as an integer.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:25.992560" elapsed="0.000036"/>
</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="NOT RUN" start="2026-05-28T22:27:25.992800" elapsed="0.000037"/>
</kw>
<kw name="验证期货标记价格列表结构">
<arg>${data}</arg>
<doc>验证期货标记价格列表的数据结构</doc>
<status status="NOT RUN" start="2026-05-28T22:27:25.993134" elapsed="0.000030"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取期货U本位标记价格</arg>
<arg>/v1/future-u/market/public/q/mark-price</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T22:27:25.993331" elapsed="0.000025"/>
</kw>
<doc>验证期货U本位标记价格接口功能</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:24.038469" elapsed="1.955173">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/mark-price</status>
</test>
<doc>期货U本位标记价格接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:24.023951" elapsed="1.970169"/>
</suite>
<suite id="s1-s2-s2-s5" name="Future U Symbol Mark Price" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/q/future_u_symbol_mark_price.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:26.001410" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:26.001124" elapsed="0.000333"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.001892" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:26.001590" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:26.002295" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:26.002073" elapsed="0.000273"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:26.001986" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:26.001556" elapsed="0.000841"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:26.003379" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:26.003262" elapsed="0.000163"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.003681" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.003787" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.003878" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.003969" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.004057" elapsed="0.000085"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:26.003496" elapsed="0.000674"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:26.004584" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:26.004314" elapsed="0.000304"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:26.004876" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:26.004702" elapsed="0.000205"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:26.005151" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:26.004989" elapsed="0.000191"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:26.005442" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:26.005263" elapsed="0.000213"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:26.005829" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:26.005591" elapsed="0.000279"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:26.006211" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:26.005986" elapsed="0.000263"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:26.006604" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:26.006360" elapsed="0.000285"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:26.007001" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:26.006758" elapsed="0.000285"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:26.007395" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:26.007153" elapsed="0.000280"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:26.004191" elapsed="0.003279"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:26.007610" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.007735" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.007857" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.007975" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.008093" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.008218" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.008335" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.008455" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.008575" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:26.007504" elapsed="0.001125"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:26.003475" elapsed="0.005176"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:26.008932" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:26.008758" elapsed="0.000224"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:26.009477" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:26.009101" elapsed="0.000641"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:26.002978" elapsed="0.006846"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:26.010009" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:26.009934" elapsed="0.000114"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:26.000664" elapsed="0.009433"/>
</kw>
<test id="s1-s2-s2-s5-t1" name="获取期货U本位符号标记价格_正常请求" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:26.013743" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:26.013059" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.014400" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:26.013945" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:26.013928" elapsed="0.000541"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:26.014502" elapsed="0.000047"/>
</return>
<msg time="2026-05-28T22:27:26.014692" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:26.012248" elapsed="0.002467"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:26.467074" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:26.467444" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=btc_usdt 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:26 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0aa49b19889-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:26.467630" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:26.467991" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=btc_usdt</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="FAIL" start="2026-05-28T22:27:26.015408" elapsed="0.453091">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=btc_usdt</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:26.468779" elapsed="0.000117"/>
</return>
<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="FAIL" start="2026-05-28T22:27:26.014840" elapsed="0.454378">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=btc_usdt</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.469968" elapsed="0.000103"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-05-28T22:27:26.470442" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${response_data}</arg>
<arg>响应数据不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.470729" elapsed="0.000039"/>
</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="NOT RUN" start="2026-05-28T22:27:26.470996" elapsed="0.000036"/>
</kw>
<kw name="验证期货符号标记价格结构">
<arg>${response_data}</arg>
<arg>btc_usdt</arg>
<doc>验证期货单个交易对标记价格的数据结构</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.471428" elapsed="0.000047"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取期货U本位符号标记价格_正常请求</arg>
<arg>/v1/future-u/market/public/q/symbol-mark-price?symbol=btc_usdt</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.471851" elapsed="0.000049"/>
</kw>
<doc>验证期货U本位单个交易对标记价格接口功能</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:26.010188" elapsed="0.462239">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=btc_usdt</status>
</test>
<test id="s1-s2-s2-s5-t2" name="获取期货U本位符号标记价格_ETH交易对" line="33">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:26.480808" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:26.479554" elapsed="0.001310"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:26.482199" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:26.481195" elapsed="0.001106"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:26.481144" elapsed="0.001202"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:26.482412" elapsed="0.000051"/>
</return>
<msg time="2026-05-28T22:27:26.482706" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:26.477972" elapsed="0.004769"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:27.143707" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:27.144085" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=eth_usdt 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:26 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0ab2bf69889-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:27.144332" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:27.144706" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=eth_usdt</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="FAIL" start="2026-05-28T22:27:26.483883" elapsed="0.661284">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=eth_usdt</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:27.145441" elapsed="0.000087"/>
</return>
<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="FAIL" start="2026-05-28T22:27:26.482956" elapsed="0.662837">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=eth_usdt</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.146492" elapsed="0.000091"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-05-28T22:27:27.146914" elapsed="0.000049"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${response_data}</arg>
<arg>响应数据不应为空</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.147203" elapsed="0.000040"/>
</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="NOT RUN" start="2026-05-28T22:27:27.147594" elapsed="0.000057"/>
</kw>
<kw name="验证期货符号标记价格结构">
<arg>${response_data}</arg>
<arg>eth_usdt</arg>
<doc>验证期货单个交易对标记价格的数据结构</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.148083" elapsed="0.000054"/>
</kw>
<kw name="本次测试简报" owner="common">
<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="NOT RUN" start="2026-05-28T22:27:27.148512" elapsed="0.000051"/>
</kw>
<doc>验证期货U本位ETH交易对标记价格接口功能</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:26.472991" elapsed="0.676060">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=eth_usdt</status>
</test>
<test id="s1-s2-s2-s5-t3" name="获取期货U本位符号标记价格_无效交易对" line="59">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:27.157394" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:27.156171" elapsed="0.001273"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.158663" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:27.157694" elapsed="0.001069"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:27.157650" elapsed="0.001158"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:27.158947" elapsed="0.000052"/>
</return>
<msg time="2026-05-28T22:27:27.159300" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:27.154428" elapsed="0.004915"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:27.290732" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:27.291097" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=invalid_symbol 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:27 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0af5fed9889-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:27.291292" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:27.291646" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=invalid_symbol</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="FAIL" start="2026-05-28T22:27:27.160697" elapsed="0.131432">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=invalid_symbol</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:27.292393" elapsed="0.000095"/>
</return>
<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="FAIL" start="2026-05-28T22:27:27.159584" elapsed="0.133195">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=invalid_symbol</status>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:27.293306" elapsed="0.000058"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-05-28T22:27:27.293630" elapsed="0.000041"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-05-28T22:27:27.293912" elapsed="0.000039"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-05-28T22:27:27.294198" elapsed="0.000038"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${code}</arg>
<arg>1</arg>
<arg>业务错误码应为1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.294484" elapsed="0.000039"/>
</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="NOT RUN" start="2026-05-28T22:27:27.294776" elapsed="0.000034"/>
</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="NOT RUN" start="2026-05-28T22:27:27.295075" elapsed="0.000036"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取期货U本位符号标记价格_无效交易对</arg>
<arg>/v1/future-u/market/public/q/symbol-mark-price?symbol=invalid_symbol</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.295724" elapsed="0.000073"/>
</kw>
<doc>验证期货U本位标记价格接口对无效交易对的处理</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:27.149645" elapsed="0.146650">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=invalid_symbol</status>
</test>
<test id="s1-s2-s2-s5-t4" name="获取期货U本位符号标记价格_缺少参数" line="85">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:27.303589" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:27.301701" elapsed="0.001941"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.304849" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:27.303884" elapsed="0.001067"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:27.303839" elapsed="0.001207"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:27.305090" elapsed="0.000040"/>
</return>
<msg time="2026-05-28T22:27:27.305346" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:27.300181" elapsed="0.005192"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:27.420191" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price 
 path_url=/v1/future-u/market/public/q/symbol-mark-price 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:27.420528" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:27 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0b04a629889-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:27.420751" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:27.421062" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price</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="FAIL" start="2026-05-28T22:27:27.306375" elapsed="0.115010">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:27.421586" elapsed="0.000073"/>
</return>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/symbol-mark-price</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="FAIL" start="2026-05-28T22:27:27.305551" elapsed="0.116289">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price</status>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:27.422222" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-05-28T22:27:27.422533" elapsed="0.000039"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-05-28T22:27:27.422793" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-05-28T22:27:27.423045" elapsed="0.000034"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${code}</arg>
<arg>1</arg>
<arg>业务错误码应为1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.423310" elapsed="0.000036"/>
</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="NOT RUN" start="2026-05-28T22:27:27.423583" elapsed="0.000038"/>
</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="NOT RUN" start="2026-05-28T22:27:27.423864" elapsed="0.000034"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取期货U本位符号标记价格_缺少参数</arg>
<arg>/v1/future-u/market/public/q/symbol-mark-price</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.424482" elapsed="0.000079"/>
</kw>
<doc>验证期货U本位标记价格接口对缺少参数的处理</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:27.296774" elapsed="0.128169">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price</status>
</test>
<test id="s1-s2-s2-s5-t5" name="获取期货U本位符号标记价格_大写交易对错误" line="111">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:27.432957" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:27.431694" elapsed="0.001318"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.434199" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:27.433252" elapsed="0.001042"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:27.433209" elapsed="0.001127"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:27.434465" elapsed="0.000054"/>
</return>
<msg time="2026-05-28T22:27:27.434808" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:27.430187" elapsed="0.004665"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:27.551002" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:27.551354" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=BTC_USDT 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:27 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0b11ccb9889-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:27.551537" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:27.551860" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=BTC_USDT</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="FAIL" start="2026-05-28T22:27:27.436103" elapsed="0.116198">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=BTC_USDT</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:27.552569" elapsed="0.000089"/>
</return>
<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="FAIL" start="2026-05-28T22:27:27.435094" elapsed="0.117852">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=BTC_USDT</status>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:27.553446" elapsed="0.000056"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-05-28T22:27:27.553774" elapsed="0.000040"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-05-28T22:27:27.554049" elapsed="0.000038"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<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="NOT RUN" start="2026-05-28T22:27:27.554325" elapsed="0.000037"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${code}</arg>
<arg>1</arg>
<arg>业务错误码应为1</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.554607" elapsed="0.000043"/>
</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="NOT RUN" start="2026-05-28T22:27:27.554894" elapsed="0.000039"/>
</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="NOT RUN" start="2026-05-28T22:27:27.555214" elapsed="0.000036"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取期货U本位符号标记价格_大写交易对错误</arg>
<arg>/v1/future-u/market/public/q/symbol-mark-price?symbol=BTC_USDT</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.555833" elapsed="0.000079"/>
</kw>
<doc>验证期货U本位标记价格接口对大写交易对的处理（应返回错误）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:27.425344" elapsed="0.131031">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/symbol-mark-price?symbol=BTC_USDT</status>
</test>
<doc>期货U本位单个交易对标记价格接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:25.995434" elapsed="1.561784"/>
</suite>
<suite id="s1-s2-s2-s6" name="Future U Ticker" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/q/future_u_ticker.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:27.567454" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:27.567134" elapsed="0.000359"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.567940" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:27.567628" elapsed="0.000382"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:27.568359" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:27.568172" elapsed="0.000248"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:27.568046" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:27.567588" elapsed="0.000900"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:27.569373" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:27.569183" elapsed="0.000239"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.569687" elapsed="0.000025"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.569827" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.569960" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.570084" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.570207" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:27.569494" elapsed="0.000767"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:27.570734" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:27.570454" elapsed="0.000324"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:27.571144" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:27.570891" elapsed="0.000297"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:27.571525" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:27.571302" elapsed="0.000260"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:27.571900" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:27.571671" elapsed="0.000267"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:27.572268" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:27.572047" elapsed="0.000259"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:27.572638" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:27.572415" elapsed="0.000263"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:27.573022" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:27.572786" elapsed="0.000279"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:27.573376" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:27.573172" elapsed="0.000236"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:27.573708" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:27.573503" elapsed="0.000238"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:27.570286" elapsed="0.003489"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:27.573888" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.573996" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.574107" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.574215" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.574321" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.574437" elapsed="0.000026"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.574551" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.574673" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.574794" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:27.573799" elapsed="0.001042"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:27.569477" elapsed="0.005382"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:27.575109" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:27.574956" elapsed="0.000198"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:27.575620" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:27.575252" elapsed="0.000619"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:27.568869" elapsed="0.007105"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:27.576151" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:27.576074" elapsed="0.000113"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:27.566780" elapsed="0.009457"/>
</kw>
<test id="s1-s2-s2-s6-t1" name="获取期货U本位单个Ticker数据_BTC" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:27.579358" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:27.578603" elapsed="0.000784"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:27.579967" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:27.579504" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:27.579486" elapsed="0.000551"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:27.580067" elapsed="0.000038"/>
</return>
<msg time="2026-05-28T22:27:27.580252" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:27.577857" elapsed="0.002418"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:28.038372" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:28.038731" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=btc_usdt 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:28 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0b42cd3f526-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:28.038942" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:28.039342" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=btc_usdt</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="FAIL" start="2026-05-28T22:27:27.580718" elapsed="0.459083">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=btc_usdt</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:28.040054" elapsed="0.000076"/>
</return>
<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="FAIL" start="2026-05-28T22:27:27.580405" elapsed="0.459980">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=btc_usdt</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.041024" elapsed="0.000080"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.041416" elapsed="0.000040"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:28.041685" elapsed="0.000040"/>
</kw>
<kw name="验证单个Ticker数据结构">
<arg>${ticker_data}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.042198" elapsed="0.000048"/>
</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="NOT RUN" start="2026-05-28T22:27:28.042496" elapsed="0.000039"/>
</kw>
<doc>验证期货U本位单个Ticker接口功能（BTC交易对）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:27.576312" elapsed="0.466658">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=btc_usdt</status>
</test>
<test id="s1-s2-s2-s6-t2" name="获取期货U本位单个Ticker数据_ETH" line="30">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.050328" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:28.049072" elapsed="0.001310"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.051663" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:28.050698" elapsed="0.001075"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:28.050658" elapsed="0.001160"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:28.051880" elapsed="0.000058"/>
</return>
<msg time="2026-05-28T22:27:28.052246" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:28.047140" elapsed="0.005151"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:28.434284" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:28.434667" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=eth_usdt 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:28 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0b4ff38f526-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:28.434857" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:28.435243" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=eth_usdt</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="FAIL" start="2026-05-28T22:27:28.053202" elapsed="0.382514">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=eth_usdt</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:28.436003" elapsed="0.000112"/>
</return>
<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="FAIL" start="2026-05-28T22:27:28.052528" elapsed="0.383871">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=eth_usdt</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.437160" elapsed="0.000104"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.437592" elapsed="0.000047"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:28.437899" elapsed="0.000035"/>
</kw>
<kw name="验证单个Ticker数据结构">
<arg>${ticker_data}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.438489" elapsed="0.000055"/>
</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="NOT RUN" start="2026-05-28T22:27:28.438803" elapsed="0.000038"/>
</kw>
<doc>验证期货U本位单个Ticker接口功能（ETH交易对）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:28.043526" elapsed="0.395805">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=eth_usdt</status>
</test>
<test id="s1-s2-s2-s6-t3" name="获取期货U本位单个Ticker数据_SOL" line="53">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.446898" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:28.445025" elapsed="0.001924"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.448067" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:28.447212" elapsed="0.000935"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:28.447158" elapsed="0.001087"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:28.448297" elapsed="0.000045"/>
</return>
<msg time="2026-05-28T22:27:28.448583" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:28.443520" elapsed="0.005101"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:28.563809" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:28.564180" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=sol_usdt 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:28 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0b76ee7f526-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:28.564412" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:28.564807" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=sol_usdt</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="FAIL" start="2026-05-28T22:27:28.449361" elapsed="0.115881">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=sol_usdt</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:28.565515" elapsed="0.000082"/>
</return>
<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="FAIL" start="2026-05-28T22:27:28.448832" elapsed="0.117015">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=sol_usdt</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.566538" elapsed="0.000081"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.566940" elapsed="0.000044"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:28.567226" elapsed="0.000042"/>
</kw>
<kw name="验证单个Ticker数据结构">
<arg>${ticker_data}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.567751" elapsed="0.000045"/>
</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="NOT RUN" start="2026-05-28T22:27:28.568042" elapsed="0.000037"/>
</kw>
<doc>验证期货U本位单个Ticker接口功能（SOL交易对）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:28.439910" elapsed="0.128619">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=sol_usdt</status>
</test>
<test id="s1-s2-s2-s6-t4" name="获取期货U本位单个Ticker数据_无效交易对" line="76">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.576149" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:28.574918" elapsed="0.001285"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.577298" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:28.576452" elapsed="0.000925"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:28.576401" elapsed="0.001013"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:28.577471" elapsed="0.000043"/>
</return>
<msg time="2026-05-28T22:27:28.577748" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:28.573399" elapsed="0.004383"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:28.692618" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:28.693136" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=invalid_symbol 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:28 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0b8397cf526-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:28.693318" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:28.693648" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=invalid_symbol</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="FAIL" start="2026-05-28T22:27:28.578513" elapsed="0.115599">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=invalid_symbol</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:28.694403" elapsed="0.000104"/>
</return>
<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="FAIL" start="2026-05-28T22:27:28.577982" elapsed="0.116809">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=invalid_symbol</status>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.695326" elapsed="0.000057"/>
</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="NOT RUN" start="2026-05-28T22:27:28.695642" elapsed="0.000040"/>
</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="NOT RUN" start="2026-05-28T22:27:28.695920" elapsed="0.000038"/>
</kw>
<doc>验证期货U本位单个Ticker接口对无效交易对的处理</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:28.569091" elapsed="0.127377">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker?symbol=invalid_symbol</status>
</test>
<test id="s1-s2-s2-s6-t5" name="获取期货U本位单个Ticker数据_缺少参数" line="93">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.704564" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:28.703238" elapsed="0.001382"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.705814" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:28.704890" elapsed="0.001023"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:28.704844" elapsed="0.001113"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:28.706023" elapsed="0.000062"/>
</return>
<msg time="2026-05-28T22:27:28.706383" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:28.701440" elapsed="0.004980"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:28.868544" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/future-u/market/public/q/ticker 
 path_url=/v1/future-u/market/public/q/ticker 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:28.868908" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/ticker 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:28 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0b90baff526-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:28.869139" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:28.869548" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker</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="FAIL" start="2026-05-28T22:27:28.708042" elapsed="0.161959">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:28.870278" elapsed="0.000093"/>
</return>
<var>${response}</var>
<arg>/v1/future-u/market/public/q/ticker</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="FAIL" start="2026-05-28T22:27:28.706645" elapsed="0.164003">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker</status>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.871175" elapsed="0.000062"/>
</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="NOT RUN" start="2026-05-28T22:27:28.871480" elapsed="0.000038"/>
</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="NOT RUN" start="2026-05-28T22:27:28.871733" elapsed="0.000035"/>
</kw>
<doc>验证期货U本位单个Ticker接口对缺少symbol参数的处理</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:28.697069" elapsed="0.175207">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/ticker</status>
</test>
<doc>期货U本位单个Ticker接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:27.560279" elapsed="1.312882"/>
</suite>
<suite id="s1-s2-s2-s7" name="Future U Tickers" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/future-u/q/future_u_tickers.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.883477" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:28.883152" elapsed="0.000362"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.884568" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:28.883650" elapsed="0.000990"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.885011" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:28.884807" elapsed="0.000270"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:28.884690" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:28.883609" elapsed="0.001535"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.886325" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:28.885931" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.886675" elapsed="0.000023"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.886821" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.886961" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.887082" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.887206" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:28.886460" elapsed="0.000796"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.887699" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:28.887430" elapsed="0.000310"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.888081" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:28.887850" elapsed="0.000270"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.888448" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:28.888225" elapsed="0.000263"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.888834" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:28.888600" elapsed="0.000272"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.889213" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:28.888975" elapsed="0.000275"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.889597" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:28.889365" elapsed="0.000270"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.889987" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:28.889740" elapsed="0.000283"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.890409" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:28.890171" elapsed="0.000276"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.890795" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:28.890555" elapsed="0.000277"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:28.887280" elapsed="0.003587"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:28.890994" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.891116" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.891239" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.891354" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.891457" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.891568" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.891670" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.891784" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.891884" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:28.890892" elapsed="0.001034"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:28.886440" elapsed="0.005505"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.892181" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:28.892037" elapsed="0.000182"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:28.892712" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:28.892320" elapsed="0.000661"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:28.885602" elapsed="0.007446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.893217" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:28.893143" elapsed="0.000112"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:28.882769" elapsed="0.010535"/>
</kw>
<test id="s1-s2-s2-s7-t1" name="获取期货U本位Tickers数据" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:28.896419" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:28.895493" elapsed="0.000981"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:28.897379" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:28.896664" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:28.896631" elapsed="0.000852"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:28.897523" elapsed="0.000036"/>
</return>
<msg time="2026-05-28T22:27:28.897769" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:28.894626" elapsed="0.003175"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:29.294117" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:29.294640" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/tickers?isPredict=true&amp;isDelivery=true 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:29 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0bbfc599889-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:29.294817" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:29.295132" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/tickers?isPredict=true&amp;isDelivery=true</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="FAIL" start="2026-05-28T22:27:28.898482" elapsed="0.397173">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/tickers?isPredict=true&amp;isDelivery=true</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:29.295900" elapsed="0.000071"/>
</return>
<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="FAIL" start="2026-05-28T22:27:28.898004" elapsed="0.398208">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/tickers?isPredict=true&amp;isDelivery=true</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.296841" elapsed="0.000077"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.297221" elapsed="0.000040"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:29.297491" elapsed="0.000037"/>
</kw>
<for flavor="IN">
<iter>
<kw name="验证Ticker数据结构">
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.298343" elapsed="0.000052"/>
</kw>
<var name="${ticker}"/>
<status status="NOT RUN" start="2026-05-28T22:27:29.297857" elapsed="0.000612"/>
</iter>
<var>${ticker}</var>
<value>@{tickers_list}</value>
<status status="NOT RUN" start="2026-05-28T22:27:29.297685" elapsed="0.000860"/>
</for>
<doc>验证期货U本位Tickers接口功能</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:28.893383" elapsed="0.405617">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/tickers?isPredict=true&amp;isDelivery=true</status>
</test>
<test id="s1-s2-s2-s7-t2" name="获取期货U本位Tickers数据_仅预测" line="29">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.310235" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:29.309010" elapsed="0.001284"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.311345" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:29.310547" elapsed="0.000878"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:29.310501" elapsed="0.000969"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:29.311529" elapsed="0.000043"/>
</return>
<msg time="2026-05-28T22:27:29.311830" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:29.307485" elapsed="0.004381"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:29.494653" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:29.494966" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/tickers?isPredict=true&amp;isDelivery=false 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:29 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0bd3fbf9889-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:29.495322" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:29.495644" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/tickers?isPredict=true&amp;isDelivery=false</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="FAIL" start="2026-05-28T22:27:29.312610" elapsed="0.183468">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/tickers?isPredict=true&amp;isDelivery=false</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:29.496308" elapsed="0.000076"/>
</return>
<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="FAIL" start="2026-05-28T22:27:29.312080" elapsed="0.184551">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/tickers?isPredict=true&amp;isDelivery=false</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.497222" elapsed="0.000077"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.497602" elapsed="0.000050"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:29.497909" elapsed="0.000036"/>
</kw>
<for flavor="IN">
<iter>
<kw name="验证Ticker数据结构">
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.498672" elapsed="0.000052"/>
</kw>
<var name="${ticker}"/>
<status status="NOT RUN" start="2026-05-28T22:27:29.498247" elapsed="0.000551"/>
</iter>
<var>${ticker}</var>
<value>@{tickers_list}</value>
<status status="NOT RUN" start="2026-05-28T22:27:29.498093" elapsed="0.000764"/>
</for>
<doc>验证期货U本位Tickers接口功能（仅预测交易对）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:29.299583" elapsed="0.199682">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/tickers?isPredict=true&amp;isDelivery=false</status>
</test>
<test id="s1-s2-s2-s7-t3" name="获取期货U本位Tickers数据_仅交割" line="51">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.506255" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:29.505046" elapsed="0.001259"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.507469" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:29.506539" elapsed="0.001024"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:29.506495" elapsed="0.001109"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:29.507668" elapsed="0.000051"/>
</return>
<msg time="2026-05-28T22:27:29.508045" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:29.503617" elapsed="0.004483"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:29.621724" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:29.622033" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/future-u/market/public/q/tickers?isPredict=false&amp;isDelivery=true 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:29 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0be0a0e9889-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:29.622203" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:29.622521" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/tickers?isPredict=false&amp;isDelivery=true</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="FAIL" start="2026-05-28T22:27:29.508915" elapsed="0.114106">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/tickers?isPredict=false&amp;isDelivery=true</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:29.623255" elapsed="0.000068"/>
</return>
<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="FAIL" start="2026-05-28T22:27:29.508340" elapsed="0.115228">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/tickers?isPredict=false&amp;isDelivery=true</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.624183" elapsed="0.000074"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${response.json()['data']}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.624608" elapsed="0.000043"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:29.624888" elapsed="0.000036"/>
</kw>
<for flavor="IN">
<iter>
<kw name="验证Ticker数据结构">
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.625726" elapsed="0.000050"/>
</kw>
<var name="${ticker}"/>
<status status="NOT RUN" start="2026-05-28T22:27:29.625234" elapsed="0.000620"/>
</iter>
<var>${ticker}</var>
<value>@{tickers_list}</value>
<status status="NOT RUN" start="2026-05-28T22:27:29.625075" elapsed="0.000844"/>
</for>
<doc>验证期货U本位Tickers接口功能（仅交割交易对）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T22:27:29.499814" elapsed="0.126538">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/future-u/market/public/q/tickers?isPredict=false&amp;isDelivery=true</status>
</test>
<doc>期货U本位Tickers接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:28.875667" elapsed="0.751511"/>
</suite>
<status status="FAIL" start="2026-05-28T22:27:18.101614" elapsed="11.528477"/>
</suite>
<status status="FAIL" start="2026-05-28T22:27:16.813348" elapsed="12.818982"/>
</suite>
<suite id="s1-s3" name="Invite" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/invite">
<suite id="s1-s3-s1" name="Profit Analysis" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/invite/profit_analysis.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.643522" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:29.643263" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.643942" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:29.643671" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.644297" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:29.644128" elapsed="0.000227"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:29.644027" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:29.643641" elapsed="0.000771"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.645195" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:29.645062" elapsed="0.000181"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.645501" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.645636" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.645750" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.645869" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.645987" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:29.645316" elapsed="0.000735"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.646452" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:29.646216" elapsed="0.000274"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.646786" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:29.646591" elapsed="0.000230"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.647099" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:29.646915" elapsed="0.000218"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.647427" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:29.647227" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.647741" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:29.647559" elapsed="0.000216"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.648080" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:29.647869" elapsed="0.000287"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.648443" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:29.648253" elapsed="0.000223"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.648782" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:29.648582" elapsed="0.000233"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.649098" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:29.648908" elapsed="0.000222"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:29.646079" elapsed="0.003090"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:29.649274" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.649383" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.649488" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.649599" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.649822" elapsed="0.000047"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.650014" elapsed="0.000022"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.650148" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.650275" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.650402" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:29.649189" elapsed="0.001268"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:29.645299" elapsed="0.005186"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.651008" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:29.650595" elapsed="0.000473"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:29.651540" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:29.651192" elapsed="0.000536"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:29.644772" elapsed="0.007034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.652030" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:29.651927" elapsed="0.000152"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:29.642953" elapsed="0.009182"/>
</kw>
<test id="s1-s3-s1-t1" name="获取用户收益信息" line="13">
<kw name="Set Log Level" owner="BuiltIn">
<arg>INFO</arg>
<doc>Sets the log threshold to the specified level.</doc>
<status status="PASS" start="2026-05-28T22:27:29.653532" elapsed="0.000275"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.654139" level="INFO">${access_token} = </msg>
<var>${access_token}</var>
<arg>\${ACCESS_TOKEN}</arg>
<arg>${EMPTY}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:29.653940" elapsed="0.000225"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.654438" level="INFO">${refresh_token} = </msg>
<var>${refresh_token}</var>
<arg>\${REFRESH_TOKEN}</arg>
<arg>${EMPTY}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:29.654274" elapsed="0.000187"/>
</kw>
<if>
<branch type="IF" condition="'${access_token}' == '${EMPTY}' or '${refresh_token}' == '${EMPTY}'">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.655599" level="INFO">${env} = prod</msg>
<var>${env}</var>
<arg>\${TEST_ENV}</arg>
<arg>bitradex_test</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:29.655432" elapsed="0.000191"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.655896" level="INFO">${token_file} = /Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_prod.json</msg>
<var>${token_file}</var>
<arg>${EXECDIR}/.bitradex_tokens_${env}.json</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T22:27:29.655729" elapsed="0.000192"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-28T22:27:29.656417" level="FAIL">File '/Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_prod.json' does not exist.</msg>
<arg>${token_file}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-28T22:27:29.656175" elapsed="0.000307">File '/Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_prod.json' does not exist.</status>
</kw>
<msg time="2026-05-28T22:27:29.656570" level="INFO">${token_file_exists} = False</msg>
<var>${token_file_exists}</var>
<arg>File Should Exist</arg>
<arg>${token_file}</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T22:27:29.656038" elapsed="0.000554"/>
</kw>
<if>
<branch type="IF" condition="not ${token_file_exists}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.657011" level="INFO">${token_file} = /Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_prod.json</msg>
<var>${token_file}</var>
<arg>${TOKEN_FILE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T22:27:29.656858" elapsed="0.000178"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-28T22:27:29.657454" level="FAIL">File '/Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_prod.json' does not exist.</msg>
<arg>${token_file}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-05-28T22:27:29.657270" elapsed="0.000237">File '/Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_prod.json' does not exist.</status>
</kw>
<msg time="2026-05-28T22:27:29.657593" level="INFO">${token_file_exists} = False</msg>
<var>${token_file_exists}</var>
<arg>File Should Exist</arg>
<arg>${token_file}</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T22:27:29.657143" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:29.656695" elapsed="0.000956"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:29.656678" elapsed="0.000995"/>
</if>
<if>
<branch type="IF" condition="not ${token_file_exists}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.658034" level="INFO">${token_file} = /Users/lihu/.bitradex_tokens.json</msg>
<var>${token_file}</var>
<arg>%{HOME}/.bitradex_tokens.json</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T22:27:29.657888" elapsed="0.000171"/>
</kw>
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-28T22:27:29.658298" level="INFO" html="true">File '&lt;a href="file:///Users/lihu/.bitradex_tokens.json"&gt;/Users/lihu/.bitradex_tokens.json&lt;/a&gt;' exists.</msg>
<arg>${token_file}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="PASS" start="2026-05-28T22:27:29.658154" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:29.657732" elapsed="0.000641"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:29.657716" elapsed="0.000678"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-28T22:27:29.658619" level="INFO" html="true">Getting file '&lt;a href="file:///Users/lihu/.bitradex_tokens.json"&gt;/Users/lihu/.bitradex_tokens.json&lt;/a&gt;'.</msg>
<msg time="2026-05-28T22:27:29.660258" level="INFO">${token_text} = {
  "accessToken": "eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJhdXRoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3V...</msg>
<var>${token_text}</var>
<arg>${token_file}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-05-28T22:27:29.658489" elapsed="0.001796"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.660711" level="INFO">${token_json} = {'accessToken': 'eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJhdXRoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3VudE...</msg>
<var>${token_json}</var>
<arg>json.loads($token_text)</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T22:27:29.660397" elapsed="0.000339"/>
</kw>
<if>
<branch type="IF" condition="'${access_token}' == '${EMPTY}'">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:27:29.661493" level="INFO">${access_token} = eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJhdXRoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3VudExldmVsIjoiMSIsInV...</msg>
<var>${access_token}</var>
<arg>${token_json}</arg>
<arg>accessToken</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T22:27:29.661324" elapsed="0.000194"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:29.660803" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:29.660787" elapsed="0.000788"/>
</if>
<if>
<branch type="IF" condition="'${refresh_token}' == '${EMPTY}'">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T22:27:29.662269" level="INFO">${refresh_token} = eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJyZWZyZXNoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3VudExldmVsIjoiMSI...</msg>
<var>${refresh_token}</var>
<arg>${token_json}</arg>
<arg>refreshToken</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-05-28T22:27:29.662108" elapsed="0.000187"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:29.661621" elapsed="0.000710"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:29.661607" elapsed="0.000743"/>
</if>
<status status="PASS" start="2026-05-28T22:27:29.654538" elapsed="0.007832"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:29.654519" elapsed="0.007868"/>
</if>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.662593" level="INFO">Length is 543.</msg>
<arg>${access_token}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T22:27:29.662475" elapsed="0.000160"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.662838" level="INFO">Length is 547.</msg>
<arg>${refresh_token}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="PASS" start="2026-05-28T22:27:29.662730" elapsed="0.000149"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${access_token}' == 'REPLACE_ME'</arg>
<arg>Fail</arg>
<arg>accessToken 未配置，请修改 ${TOKEN_FILE} 中的 accessToken</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T22:27:29.663001" elapsed="0.000139"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn">
<arg>'${refresh_token}' == 'REPLACE_ME'</arg>
<arg>Fail</arg>
<arg>refreshToken 未配置，请修改 ${TOKEN_FILE} 中的 refreshToken</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-05-28T22:27:29.663250" elapsed="0.000125"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.663616" level="INFO">${user_id} = </msg>
<var>${user_id}</var>
<arg>${USER_ID}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T22:27:29.663478" elapsed="0.000161"/>
</kw>
<if>
<branch type="IF" condition="'${user_id}' == '${EMPTY}'">
<kw name="Split String" owner="String">
<msg time="2026-05-28T22:27:29.664385" level="INFO">${parts} = ['eyJhbGciOiJSUzI1NiJ9', 'eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJhdXRoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3VudExldmVsIjoiMS...</msg>
<var>${parts}</var>
<arg>${access_token}</arg>
<arg>.</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="PASS" start="2026-05-28T22:27:29.664198" elapsed="0.000214"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.665064" level="INFO">${payload_b64} = eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJhdXRoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3VudExldmVsIjoiMSIsInVzZXJOYW1lIjoiYngwMDFA...</msg>
<var>${payload_b64}</var>
<arg>${parts[1]}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T22:27:29.664520" elapsed="0.000595"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.665661" level="INFO">${payload} = {'accountId': '58661579376', 'sub': 'bx001@yopmail.net', 'scope': 'auth', 'lastAuthTime': 1776349146309, 'signType': 'UP', 'accountLevel': '1', 'userName': 'bx001@yopmail.net', 'exp': 1778941146, 'dev...</msg>
<var>${payload}</var>
<arg>__import__('json').loads(__import__('base64').urlsafe_b64decode(($payload_b64 + '=' * (-len($payload_b64) % 4)).encode('utf-8')).decode('utf-8'))</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-05-28T22:27:29.665222" elapsed="0.000466"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${payload}</arg>
<arg>userId</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T22:27:29.665928" elapsed="0.000149"/>
</kw>
<msg time="2026-05-28T22:27:29.666157" level="INFO">${has_user_id} = True</msg>
<var>${has_user_id}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${payload}</arg>
<arg>userId</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T22:27:29.665797" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="${has_user_id}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.666868" level="INFO">${user_id} = 58661579376</msg>
<var>${user_id}</var>
<arg>${payload['userId']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T22:27:29.666378" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:29.666249" elapsed="0.000677"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${user_id}</var>
<arg>${payload['accountId']}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:29.667040" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:29.666946" elapsed="0.000142"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:29.666232" elapsed="0.000873"/>
</if>
<status status="PASS" start="2026-05-28T22:27:29.663701" elapsed="0.003424"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:29.663685" elapsed="0.003458"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.667385" level="INFO">${user_id} = 58661579376</msg>
<var>${user_id}</var>
<arg>${user_id}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="PASS" start="2026-05-28T22:27:29.667232" elapsed="0.000172"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.667710" level="INFO">&amp;{params} = { user-id=58661579376 }</msg>
<var>&amp;{params}</var>
<arg>user-id=${user_id}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:29.667504" elapsed="0.000230"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:29.668972" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.2.7(7051);iPhone | app-version-name=1.2.7 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7051 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:29.668438" 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="PASS" start="2026-05-28T22:27:29.669534" elapsed="0.000184"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:29.669091" elapsed="0.000661"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:29.669078" elapsed="0.000695"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:29.669802" elapsed="0.000032"/>
</return>
<msg time="2026-05-28T22:27:29.669981" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.2.7(7051);iPhone', 'app-version-name': '1.2.7', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<arg>app_version=1.2.7</arg>
<arg>build_code=7051</arg>
<arg>token=${access_token}</arg>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:29.667908" elapsed="0.002094"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>uid=${user_id}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-05-28T22:27:29.670091" elapsed="0.000149"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:30.135604" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/invite/public/user-team/profit/user?user-id=58661579376 
 path_url=/v1/invite/public/user-team/profit/user?user-id=58661579376 
 headers={'user-agent': 'BitradeX-Prod 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-prod', '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.mobi', 'authorization': 'Bearer eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJhdXRoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3VudExldmVsIjoiMSIsInVzZXJOYW1lIjoiYngwMDFAeW9wbWFpbC5uZXQiLCJleHAiOjE3Nzg5NDExNDYsImRldmljZSI6ImFwcCIsInVzZXJJZCI6NTg2NjE1NzkzNzYsInVzZXJDb2RlIjoiNTY3NGE3OGVjOWQ2ZjM3YmYyM2EwZWYxNWU0MDcxZjQifQ.KasfzVllhRMOWJ898b1ynWHBLpJZulHCGZuOqdTXBC65cya1UuG8BuoRXAECLO-qZO2pM0Ce5uPRSPqNaLdhu7qPfF0zIzRGGJi81cSMj9R1VNEctARZH55L8TttgYW66o0KP3kIXTBVQPwFfcGSG8qtOLt3b-ohbCH3IW373FY', 'token': 'eyJhbGciOiJSUzI1NiJ9.eyJhY2NvdW50SWQiOiI1ODY2MTU3OTM3NiIsInN1YiI6ImJ4MDAxQHlvcG1haWwubmV0Iiwic2NvcGUiOiJhdXRoIiwibGFzdEF1dGhUaW1lIjoxNzc2MzQ5MTQ2MzA5LCJzaWduVHlwZSI6IlVQIiwiYWNjb3VudExldmVsIjoiMSIsInVzZXJOYW1lIjoiYngwMDFAeW9wbWFpbC5uZXQiLCJleHAiOjE3Nzg5NDExNDYsImRldmljZSI6ImFwcCIsInVzZXJJZCI6NTg2NjE1NzkzNzYsInVzZXJDb2RlIjoiNTY3NGE3OGVjOWQ2ZjM3YmYyM2EwZWYxNWU0MDcxZjQifQ.KasfzVllhRMOWJ898b1ynWHBLpJZulHCGZuOqdTXBC65cya1UuG8BuoRXAECLO-qZO2pM0Ce5uPRSPqNaLdhu7qPfF0zIzRGGJi81cSMj9R1VNEctARZH55L8TttgYW66o0KP3kIXTBVQPwFfcGSG8qtOLt3b-ohbCH3IW373FY', 'uid': '58661579376'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:30.136168" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/invite/public/user-team/profit/user?user-id=58661579376 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:30 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0c13b041241-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:30.136376" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:30.136767" level="INFO">${response} = &lt;Response [456]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>/v1/invite/public/user-team/profit/user</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=any</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T22:27:29.670331" elapsed="0.466500"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T22:27:30.139432" level="FAIL">Resolving variable '${response.json()}' failed: JSONDecodeError: Expecting value: line 1 column 1 (char 0)</msg>
<arg>${response.json()}</arg>
<arg>code</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-05-28T22:27:30.137879" elapsed="0.001649">Resolving variable '${response.json()}' failed: JSONDecodeError: Expecting value: line 1 column 1 (char 0)</status>
</kw>
<msg time="2026-05-28T22:27:30.139765" level="INFO">${has_code} = False</msg>
<var>${has_code}</var>
<arg>Dictionary Should Contain Key</arg>
<arg>${response.json()}</arg>
<arg>code</arg>
<doc>Runs the given keyword with given arguments and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-05-28T22:27:30.137404" elapsed="0.002423"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.141484" level="INFO">${biz_code} = </msg>
<var>${biz_code}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-05-28T22:27:30.140140" elapsed="0.001401"/>
</kw>
<if>
<branch type="IF" condition="${has_code}">
<kw name="Set Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:30.142096" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:30.141752" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:30.141690" elapsed="0.000655"/>
</if>
<if>
<branch type="IF" condition="${response.status_code} == 401 or '${biz_code}' == '401'">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:30.144038" elapsed="0.000047"/>
</kw>
<if>
<branch type="IF" condition="'${refresh_status}' == 'PASS'">
<kw name="Set Variable" owner="BuiltIn">
<var>${response}</var>
<arg>${refresh_result}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.144509" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:30.144283" elapsed="0.000357"/>
</branch>
<branch type="ELSE">
<kw name="Skip" owner="BuiltIn">
<arg>Token已失效且refreshToken不可用: ${refresh_result}</arg>
<doc>Skips the rest of the current test.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.144890" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:30.144695" elapsed="0.000310"/>
</branch>
<status status="NOT RUN" start="2026-05-28T22:27:30.144247" elapsed="0.000800"/>
</if>
<status status="NOT RUN" start="2026-05-28T22:27:30.142531" elapsed="0.002567"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:30.142488" elapsed="0.002655"/>
</if>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.147155" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-05-28T22:27:30.147327" level="FAIL">456 != 200</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-05-28T22:27:30.146279" elapsed="0.001174">456 != 200</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:30.147653" elapsed="0.000032"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>接口响应成功，状态码: ${status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.147855" elapsed="0.000027"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="FAIL" start="2026-05-28T22:27:30.145553" elapsed="0.002500">456 != 200</status>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<var>${env}</var>
<arg>\${TEST_ENV}</arg>
<arg>bitradex_test</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.148251" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${resp_json}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.148441" elapsed="0.000120"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${resp_code}</var>
<arg>${resp_json}</arg>
<arg>code</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.148732" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'bitradex_test' and ${resp_code} == 401">
<kw name="Skip" owner="BuiltIn">
<arg>测试环境该账号暂无权限/登录态不支持该接口，返回 code=401</arg>
<doc>Skips the rest of the current test.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.149020" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:30.148874" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-05-28T22:27:30.148845" elapsed="0.000287"/>
</if>
<kw name="验证响应字段值" owner="common">
<arg>${response}</arg>
<arg>code</arg>
<arg>${0}</arg>
<doc>验证响应JSON字段的值</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.149359" elapsed="0.000042"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.149624" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.149820" elapsed="0.000026"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${data}</arg>
<arg>uid</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.150001" elapsed="0.000028"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${data}</arg>
<arg>level</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.150172" elapsed="0.000025"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${data}</arg>
<arg>totalEarnings</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.150351" elapsed="0.000025"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>用户 ${user_id} 的总收益为: ${data['totalEarnings']}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.150534" elapsed="0.000025"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.150752" elapsed="0.000028"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取用户收益信息</arg>
<arg>/v1/invite/public/user-team/profit/user</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.150986" elapsed="0.000027"/>
</kw>
<doc>验证获取用户收益信息接口功能</doc>
<tag>invite</tag>
<tag>profit</tag>
<status status="FAIL" start="2026-05-28T22:27:29.652210" elapsed="0.499068">456 != 200</status>
</test>
<doc>用户及团队收益分析-获取用户收益信息</doc>
<status status="FAIL" start="2026-05-28T22:27:29.636246" elapsed="0.515557"/>
</suite>
<status status="FAIL" start="2026-05-28T22:27:29.633612" elapsed="0.520008"/>
</suite>
<suite id="s1-s4" name="Spot" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot">
<suite id="s1-s4-s1" name="Balance" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/balance">
<suite id="s1-s4-s1-s1" name="Balance Currencies" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/balance/balance_currencies.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.161692" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:30.161492" elapsed="0.000227"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.161980" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:30.161796" elapsed="0.000228"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.162245" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:30.162121" elapsed="0.000163"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:30.162048" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:30.161777" elapsed="0.000553"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.162946" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:30.162847" elapsed="0.000140"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.163185" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.163287" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.163388" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.163613" elapsed="0.000031"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.163762" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:30.163043" elapsed="0.000779"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.164475" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:30.164042" elapsed="0.000482"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.164880" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:30.164646" elapsed="0.000278"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.165276" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:30.165042" elapsed="0.000277"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.165715" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:30.165484" elapsed="0.000275"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.166115" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:30.165878" elapsed="0.000280"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.166517" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:30.166277" elapsed="0.000283"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.166926" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:30.166682" elapsed="0.000288"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.167336" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:30.167088" elapsed="0.000290"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.167748" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:30.167500" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:30.163850" elapsed="0.003978"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:30.167942" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.168054" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.168160" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.168263" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.168366" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.168468" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.168567" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.168669" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.168770" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:30.167850" elapsed="0.000963"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:30.163028" elapsed="0.005804"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.169067" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:30.168916" elapsed="0.000193"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:30.169470" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:30.169208" elapsed="0.000407"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:30.162617" elapsed="0.007061"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.169861" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:30.169779" elapsed="0.000121"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:30.161262" elapsed="0.008686"/>
</kw>
<test id="s1-s4-s1-s1-t1" name="获取余额货币列表" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.171252" level="INFO">&amp;{params} = { version=4a2bb64c7fc890df605105b750aac8b3 }</msg>
<var>&amp;{params}</var>
<arg>version=4a2bb64c7fc890df605105b750aac8b3</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:30.171072" elapsed="0.000205"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.172785" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:30.172178" elapsed="0.000636"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.173414" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:30.172929" elapsed="0.000585"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:30.172911" elapsed="0.000624"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:30.173566" elapsed="0.000026"/>
</return>
<msg time="2026-05-28T22:27:30.173747" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:30.171464" elapsed="0.002308"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:30.661614" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/spot/balance/public/currencies?version=4a2bb64c7fc890df605105b750aac8b3 
 path_url=/v1/spot/balance/public/currencies?version=4a2bb64c7fc890df605105b750aac8b3 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:30.661979" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/spot/balance/public/currencies?version=4a2bb64c7fc890df605105b750aac8b3 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:30 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0c48ea858bf-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:30.662155" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:30.662602" level="INFO">${response} = &lt;Response [456]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>url=/v1/spot/balance/public/currencies</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=any</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T22:27:30.173869" elapsed="0.488794"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.664752" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-05-28T22:27:30.665031" level="FAIL">456 != 200</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-05-28T22:27:30.663292" elapsed="0.001927">456 != 200</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${resp_json}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.665528" elapsed="0.000050"/>
</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="NOT RUN" start="2026-05-28T22:27:30.665813" elapsed="0.000039"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:30.666109" elapsed="0.000036"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.666424" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.666706" elapsed="0.000039"/>
</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="NOT RUN" start="2026-05-28T22:27:30.666999" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:30.667313" elapsed="0.000039"/>
</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="NOT RUN" start="2026-05-28T22:27:30.667587" elapsed="0.000040"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>获取余额货币列表 /v1/spot/balance/public/currencies status=${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.667850" elapsed="0.000036"/>
</kw>
<doc>验证余额货币列表接口功能</doc>
<tag>spot</tag>
<status status="FAIL" start="2026-05-28T22:27:30.170005" elapsed="0.498363">456 != 200</status>
</test>
<doc>余额货币列表接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:30.157899" elapsed="0.511272"/>
</suite>
<suite id="s1-s4-s1-s2" name="Balance Price Convert" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/balance/balance_price_convert.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.679212" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:30.678911" elapsed="0.000345"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.679724" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:30.679405" elapsed="0.000386"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.680122" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:30.679955" elapsed="0.000229"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:30.679838" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:30.679357" elapsed="0.000893"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.681156" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:30.681021" elapsed="0.000633"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.681924" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.682056" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.682184" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.682312" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.682437" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:30.681731" elapsed="0.000767"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.682953" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:30.682681" elapsed="0.000315"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.683345" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:30.683108" elapsed="0.000280"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.683735" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:30.683504" elapsed="0.000272"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.684147" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:30.683890" elapsed="0.000296"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.684532" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:30.684298" elapsed="0.000275"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.684902" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:30.684679" elapsed="0.000262"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.685300" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:30.685049" elapsed="0.000304"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.685703" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:30.685461" elapsed="0.000281"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.686091" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:30.685849" elapsed="0.000281"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:30.682524" elapsed="0.003652"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:30.686311" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.686431" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.686560" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.686689" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.686808" elapsed="0.000029"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.686951" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.687073" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.687198" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.687320" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:30.686205" elapsed="0.001170"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:30.681712" elapsed="0.005689"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.687687" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:30.687508" elapsed="0.000226"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:30.688242" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:30.687846" elapsed="0.000655"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:30.680681" elapsed="0.007947"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.688837" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:30.688745" elapsed="0.000134"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:30.678525" elapsed="0.010413"/>
</kw>
<test id="s1-s4-s1-s2-t1" name="获取货币价格转换" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.690550" level="INFO">&amp;{params} = { converts=usd,btc,usdt }</msg>
<var>&amp;{params}</var>
<arg>converts=usd,btc,usdt</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:30.690318" elapsed="0.000259"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:30.692243" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:30.691600" elapsed="0.000669"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:30.692944" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:30.692395" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:30.692374" elapsed="0.000645"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:30.693068" elapsed="0.000052"/>
</return>
<msg time="2026-05-28T22:27:30.693295" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:30.690799" elapsed="0.002521"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:32.127153" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:32.127532" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/spot/balance/public/price/currency/convert?converts=usd%2Cbtc%2Cusdt 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:32 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0cda810b1e6-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:32.127765" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:32.128238" level="INFO">${response} = &lt;Response [456]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>url=/v1/spot/balance/public/price/currency/convert</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=any</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T22:27:30.693426" elapsed="1.434877"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.130337" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-05-28T22:27:32.130618" level="FAIL">456 != 200</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-05-28T22:27:32.128858" elapsed="0.001934">456 != 200</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${resp_json}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.131169" elapsed="0.000054"/>
</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="NOT RUN" start="2026-05-28T22:27:32.131460" elapsed="0.000042"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:32.131730" elapsed="0.000040"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.132004" elapsed="0.000038"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.132258" elapsed="0.000038"/>
</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="NOT RUN" start="2026-05-28T22:27:32.132523" elapsed="0.000038"/>
</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="NOT RUN" start="2026-05-28T22:27:32.132809" elapsed="0.000036"/>
</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="NOT RUN" start="2026-05-28T22:27:32.133237" elapsed="0.000039"/>
</kw>
<kw name="Log" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:32.133497" elapsed="0.000039"/>
</kw>
<doc>验证货币价格转换接口功能</doc>
<tag>spot</tag>
<status status="FAIL" start="2026-05-28T22:27:30.689018" elapsed="1.444951">456 != 200</status>
</test>
<test id="s1-s4-s1-s2-t2" name="获取单一货币价格转换" line="37">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.138108" level="INFO">&amp;{params} = { converts=usd }</msg>
<var>&amp;{params}</var>
<arg>converts=usd</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:32.137663" elapsed="0.000494"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.141154" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:32.139995" elapsed="0.001210"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.142331" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:32.141457" elapsed="0.000954"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:32.141406" elapsed="0.001044"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:32.142508" elapsed="0.000051"/>
</return>
<msg time="2026-05-28T22:27:32.142805" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:32.138635" elapsed="0.004204"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:32.259277" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/spot/balance/public/price/currency/convert?converts=usd 
 path_url=/v1/spot/balance/public/price/currency/convert?converts=usd 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:32.259663" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/spot/balance/public/price/currency/convert?converts=usd 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:32 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0ce8aaeb1e6-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:32.259831" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:32.260239" level="INFO">${response} = &lt;Response [456]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>url=/v1/spot/balance/public/price/currency/convert</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=any</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T22:27:32.142983" elapsed="0.117332"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.262384" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-05-28T22:27:32.262659" level="FAIL">456 != 200</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-05-28T22:27:32.260924" elapsed="0.001914">456 != 200</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${resp_json}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.263156" elapsed="0.000043"/>
</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="NOT RUN" start="2026-05-28T22:27:32.263429" elapsed="0.000039"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:32.263714" elapsed="0.000043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.264007" elapsed="0.000035"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.264270" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:32.264557" elapsed="0.000037"/>
</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="NOT RUN" start="2026-05-28T22:27:32.264856" elapsed="0.000035"/>
</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="NOT RUN" start="2026-05-28T22:27:32.265225" elapsed="0.000036"/>
</kw>
<kw name="Log" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:32.265486" elapsed="0.000035"/>
</kw>
<doc>验证单一货币价格转换接口功能</doc>
<tag>spot</tag>
<status status="FAIL" start="2026-05-28T22:27:32.134549" elapsed="0.131363">456 != 200</status>
</test>
<doc>货币价格转换接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:30.671589" elapsed="1.594962"/>
</suite>
<status status="FAIL" start="2026-05-28T22:27:30.156230" elapsed="2.112355"/>
</suite>
<suite id="s1-s4-s2" name="Mark" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/mark">
<suite id="s1-s4-s2-s1" name="24H Market" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/mark/24h_market.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.276757" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:32.276519" elapsed="0.000270"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.277177" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:32.276915" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.277524" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:32.277375" elapsed="0.000201"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:32.277279" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:32.276873" elapsed="0.000766"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.278403" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:32.278292" elapsed="0.000150"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.278679" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.278796" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.278931" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.279038" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.279145" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:32.278509" elapsed="0.000685"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.279580" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:32.279347" elapsed="0.000269"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.279922" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:32.279710" elapsed="0.000249"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.280256" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:32.280052" elapsed="0.000237"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.280581" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:32.280384" elapsed="0.000236"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.280926" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:32.280724" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.281255" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:32.281052" elapsed="0.000236"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.281598" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:32.281383" elapsed="0.000247"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.281938" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:32.281728" elapsed="0.000242"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.282284" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:32.282075" elapsed="0.000243"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:32.279218" elapsed="0.003130"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:32.282455" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.282557" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.282727" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.282830" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.283077" elapsed="0.000051"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.283279" elapsed="0.000022"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.283420" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.283550" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.283677" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:32.282371" elapsed="0.001364"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:32.278492" elapsed="0.005271"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.284170" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:32.283882" elapsed="0.000353"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:32.284700" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:32.284359" elapsed="0.000538"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:32.277998" elapsed="0.006979"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.285220" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:32.285114" elapsed="0.000154"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:32.276205" elapsed="0.009135"/>
</kw>
<test id="s1-s4-s2-s1-t1" name="获取24小时行情数据" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:32.288978" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:32.288016" elapsed="0.000998"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:32.289782" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:32.289165" elapsed="0.000689"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:32.289138" elapsed="0.000743"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:32.289919" elapsed="0.000040"/>
</return>
<msg time="2026-05-28T22:27:32.290153" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:32.287090" elapsed="0.003092"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:33.690673" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/spot/market/public/ticker/24h 
 path_url=/v1/spot/market/public/ticker/24h 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:33.691038" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/spot/market/public/ticker/24h 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:33 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0d7784be392-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:33.691252" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:33.691703" level="INFO">${response} = &lt;Response [456]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>url=/v1/spot/market/public/ticker/24h</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=any</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T22:27:32.290304" elapsed="1.401467"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:27:33.693884" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-05-28T22:27:33.694156" level="FAIL">456 != 200</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-05-28T22:27:33.692442" elapsed="0.001896">456 != 200</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${resp_json}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:33.694699" elapsed="0.000055"/>
</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="NOT RUN" start="2026-05-28T22:27:33.695013" elapsed="0.000041"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:33.695298" elapsed="0.000038"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:33.695600" elapsed="0.000037"/>
</kw>
<doc>验证24小时行情接口基本功能获取24小时行情数据</doc>
<tag>market</tag>
<status status="FAIL" start="2026-05-28T22:27:32.285413" elapsed="1.410693">456 != 200</status>
</test>
<doc>24小时行情</doc>
<status status="FAIL" start="2026-05-28T22:27:32.271770" elapsed="1.425180"/>
</suite>
<suite id="s1-s4-s2-s2" name="Market Depth" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/mark/market_depth.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:33.705668" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:33.705410" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:33.706110" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:33.705843" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:33.706455" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:33.706304" elapsed="0.000206"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:33.706205" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:33.705799" elapsed="0.000776"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:33.707662" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:33.707536" 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-05-28T22:27:33.707967" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:33.708093" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:33.708213" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:33.708331" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:33.708458" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:33.707780" elapsed="0.000728"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:33.708954" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:33.708682" elapsed="0.000313"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:33.709351" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:33.709106" elapsed="0.000317"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:33.709818" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:33.709566" elapsed="0.000291"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:33.710178" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:33.709963" elapsed="0.000252"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:33.710521" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:33.710317" elapsed="0.000238"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:33.710854" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:33.710654" elapsed="0.000244"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:33.711216" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:33.711001" elapsed="0.000249"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:33.711582" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:33.711347" elapsed="0.000269"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:33.711915" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:33.711710" elapsed="0.000238"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:33.708531" elapsed="0.003506"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:33.712157" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:33.712269" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:33.712384" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:33.712490" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:33.712597" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:33.712702" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:33.712805" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:33.712910" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:33.713017" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:33.712063" elapsed="0.001001"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:33.707763" elapsed="0.005322"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:33.713358" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:33.713181" elapsed="0.000222"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:33.713940" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:33.713512" elapsed="0.000643"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:33.707233" elapsed="0.007021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:33.714547" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:33.714411" elapsed="0.000186"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:33.705044" elapsed="0.009614"/>
</kw>
<test id="s1-s4-s2-s2-t1" name="获取市场深度数据" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:33.716328" level="INFO">&amp;{params} = { symbol=btc_usdt | limit=1000 }</msg>
<var>&amp;{params}</var>
<arg>symbol=btc_usdt</arg>
<arg>limit=1000</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:33.716051" elapsed="0.000311"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:33.718348" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:33.717566" elapsed="0.000818"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:33.719166" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:33.718547" elapsed="0.000693"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:33.718521" elapsed="0.000746"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:33.719305" elapsed="0.000037"/>
</return>
<msg time="2026-05-28T22:27:33.719539" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:33.716619" elapsed="0.002950"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:34.390822" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:34.391215" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/spot/market/public/depth?symbol=btc_usdt&amp;limit=1000 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:34 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0dbd8e48eb8-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:34.391521" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:34.391915" level="INFO">${response} = &lt;Response [456]&gt;</msg>
<var>${response}</var>
<arg>api_session</arg>
<arg>url=/v1/spot/market/public/depth</arg>
<arg>params=&amp;{params}</arg>
<arg>headers=${headers}</arg>
<arg>expected_status=any</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-05-28T22:27:33.719692" elapsed="0.672287"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.394104" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-05-28T22:27:34.394367" level="FAIL">456 != 200</msg>
<arg>${response.status_code}</arg>
<arg>200</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="FAIL" start="2026-05-28T22:27:34.392589" elapsed="0.001973">456 != 200</status>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${resp_json}</var>
<arg>${response.json()}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.394896" elapsed="0.000048"/>
</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="NOT RUN" start="2026-05-28T22:27:34.395193" elapsed="0.000040"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:34.395474" elapsed="0.000042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${json_str}</arg>
<arg>console=yes</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.395770" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.396053" elapsed="0.000038"/>
</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="NOT RUN" start="2026-05-28T22:27:34.396330" elapsed="0.000034"/>
</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="NOT RUN" start="2026-05-28T22:27:34.396634" elapsed="0.000036"/>
</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="NOT RUN" start="2026-05-28T22:27:34.396909" elapsed="0.000035"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>获取市场深度数据 /v1/spot/market/public/depth status=${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.397170" elapsed="0.000041"/>
</kw>
<doc>验证市场深度数据接口功能</doc>
<tag>market</tag>
<status status="FAIL" start="2026-05-28T22:27:33.714727" elapsed="0.682937">456 != 200</status>
</test>
<doc>市场深度数据接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:33.698894" elapsed="0.699561"/>
</suite>
<suite id="s1-s4-s2-s3" name="Market Plate" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/mark/market_plate.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.407252" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:34.406961" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.407713" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:34.407436" elapsed="0.000340"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.408068" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:34.407918" elapsed="0.000207"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:34.407818" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:34.407392" elapsed="0.000787"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.408970" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:34.408848" elapsed="0.000174"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.409268" elapsed="0.000023"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.409408" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.409533" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.409653" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.409776" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:34.409091" elapsed="0.000742"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.410279" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:34.410017" elapsed="0.000304"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.410713" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:34.410478" elapsed="0.000274"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.411077" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:34.410858" elapsed="0.000256"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.411455" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:34.411222" elapsed="0.000271"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.411813" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:34.411598" elapsed="0.000243"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.412116" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:34.411937" elapsed="0.000208"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.412435" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:34.412234" elapsed="0.000230"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.412729" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:34.412549" elapsed="0.000209"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.413030" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:34.412848" elapsed="0.000211"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:34.409860" elapsed="0.003236"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:34.413191" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.413296" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.413390" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.413481" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.413570" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.413659" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.413749" elapsed="0.000012"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.413841" elapsed="0.000012"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.413933" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:34.413116" elapsed="0.000858"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:34.409074" elapsed="0.004919"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.414193" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:34.414067" elapsed="0.000162"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:34.414640" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:34.414317" elapsed="0.000532"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:34.408535" elapsed="0.006380"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.415081" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:34.415013" elapsed="0.000100"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:34.406576" elapsed="0.008581"/>
</kw>
<test id="s1-s4-s2-s3-t1" name="获取市场盘口数据" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.420239" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:34.419451" elapsed="0.000830"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.420991" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:34.420467" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:34.420443" elapsed="0.000631"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:34.421110" elapsed="0.000029"/>
</return>
<msg time="2026-05-28T22:27:34.421303" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:34.418477" elapsed="0.002852"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:34.850189" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/spot/market/public/plate 
 path_url=/v1/spot/market/public/plate 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:34.850446" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/spot/market/public/plate 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:34 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0debf0e7897-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:34.850605" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:34.850864" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/plate</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="FAIL" start="2026-05-28T22:27:34.422128" elapsed="0.429048">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/plate</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:34.851329" elapsed="0.000049"/>
</return>
<var>${response}</var>
<arg>/v1/spot/market/public/plate</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="FAIL" start="2026-05-28T22:27:34.421471" elapsed="0.430065">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/plate</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.851978" elapsed="0.000060"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.852273" elapsed="0.000031"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.852441" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.852621" elapsed="0.000020"/>
</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="NOT RUN" start="2026-05-28T22:27:34.852742" elapsed="0.000015"/>
</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="NOT RUN" start="2026-05-28T22:27:34.852873" elapsed="0.000017"/>
</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="NOT RUN" start="2026-05-28T22:27:34.852989" elapsed="0.000014"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取市场盘口数据</arg>
<arg>/v1/spot/market/public/plate</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.853162" elapsed="0.000022"/>
</kw>
<doc>验证市场盘口数据接口功能</doc>
<tag>market</tag>
<status status="FAIL" start="2026-05-28T22:27:34.415229" elapsed="0.438231">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/plate</status>
</test>
<doc>市场盘口数据接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:34.400273" elapsed="0.453651"/>
</suite>
<suite id="s1-s4-s2-s4" name="Market Symbol" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/mark/market_symbol.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.862530" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:34.862172" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.863067" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:34.862717" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.863561" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:34.863333" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:34.863193" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:34.862678" elapsed="0.001010"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.864545" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:34.864403" elapsed="0.000248"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.864943" elapsed="0.000027"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.865103" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.865252" elapsed="0.000022"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.865397" elapsed="0.000023"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.865547" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:34.864736" elapsed="0.000873"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.866189" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:34.865858" elapsed="0.000386"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.866655" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:34.866377" elapsed="0.000331"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.867133" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:34.866857" elapsed="0.000323"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.867577" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:34.867314" elapsed="0.000309"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.868016" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:34.867755" elapsed="0.000302"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.868400" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:34.868170" elapsed="0.000270"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.868802" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:34.868558" elapsed="0.000283"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.869190" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:34.868950" elapsed="0.000280"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.869586" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:34.869347" elapsed="0.000280"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:34.865644" elapsed="0.004022"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:34.869808" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.869933" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.870060" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.870170" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.870271" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.870463" elapsed="0.000024"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.870583" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.870690" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.870792" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:34.869698" elapsed="0.001138"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:34.864711" elapsed="0.006147"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.871211" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:34.870956" elapsed="0.000312"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:34.871801" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:34.871382" elapsed="0.000717"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:34.864083" elapsed="0.008223"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.872579" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:34.872453" elapsed="0.000170"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:34.861770" elapsed="0.010912"/>
</kw>
<test id="s1-s4-s2-s4-t1" name="获取市场交易对列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:34.876511" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:34.875599" elapsed="0.000973"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:34.877448" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:34.876755" elapsed="0.000768"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:34.876723" elapsed="0.000828"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:34.877594" elapsed="0.000040"/>
</return>
<msg time="2026-05-28T22:27:34.877848" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:34.874466" elapsed="0.003412"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:35.684786" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/spot/market/public/symbol 
 path_url=/v1/spot/market/public/symbol 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:35.685177" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/spot/market/public/symbol 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:35 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0e3790683c1-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:35.685363" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:35.685736" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/symbol</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="FAIL" start="2026-05-28T22:27:34.878900" elapsed="0.807351">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/symbol</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:35.686537" elapsed="0.000101"/>
</return>
<var>${response}</var>
<arg>/v1/spot/market/public/symbol</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="FAIL" start="2026-05-28T22:27:34.878075" elapsed="0.808843">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/symbol</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.687605" elapsed="0.000092"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.687991" elapsed="0.000048"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.688334" elapsed="0.000058"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.688729" elapsed="0.000039"/>
</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="NOT RUN" start="2026-05-28T22:27:35.689013" elapsed="0.000038"/>
</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="NOT RUN" start="2026-05-28T22:27:35.689336" elapsed="0.000036"/>
</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="NOT RUN" start="2026-05-28T22:27:35.689606" elapsed="0.000038"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取市场交易对列表</arg>
<arg>/v1/spot/market/public/symbol</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.690042" elapsed="0.000050"/>
</kw>
<doc>验证市场交易对接口功能</doc>
<tag>market</tag>
<status status="FAIL" start="2026-05-28T22:27:34.872781" elapsed="0.817815">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/symbol</status>
</test>
<doc>市场交易对接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:34.854956" elapsed="0.836519"/>
</suite>
<suite id="s1-s4-s2-s5" name="Market Time" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/mark/market_time.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:35.699805" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:35.699482" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.700307" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:35.699984" elapsed="0.000383"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:35.700677" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:35.700499" elapsed="0.000230"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:35.700399" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:35.699942" elapsed="0.000846"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:35.701828" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:35.701464" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.702129" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.702262" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.702387" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.702505" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.702628" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:35.701946" elapsed="0.000739"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:35.703122" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:35.702864" elapsed="0.000300"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:35.703525" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:35.703276" elapsed="0.000290"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:35.703904" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:35.703678" elapsed="0.000266"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:35.704291" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:35.704052" elapsed="0.000276"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:35.704659" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:35.704434" elapsed="0.000266"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:35.704969" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:35.704791" elapsed="0.000217"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:35.705307" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:35.705099" elapsed="0.000238"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:35.705616" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:35.705423" elapsed="0.000223"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:35.705918" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:35.705728" elapsed="0.000229"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:35.702710" elapsed="0.003279"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:35.706086" elapsed="0.000014"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.706190" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.706295" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.706399" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.706515" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.706609" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.706738" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.706828" elapsed="0.000013"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.706920" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:35.706010" elapsed="0.000968"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:35.701929" elapsed="0.005065"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:35.707193" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:35.707069" elapsed="0.000160"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:35.707656" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:35.707325" elapsed="0.000557"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:35.701164" elapsed="0.006777"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:35.708098" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:35.708029" elapsed="0.000101"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:35.699124" elapsed="0.009057"/>
</kw>
<test id="s1-s4-s2-s5-t1" name="获取市场服务器时间" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:35.711560" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:35.710764" elapsed="0.000839"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:35.712393" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:35.711773" elapsed="0.000690"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:35.711748" elapsed="0.000743"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:35.712532" elapsed="0.000035"/>
</return>
<msg time="2026-05-28T22:27:35.712770" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:35.709736" elapsed="0.003064"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:36.403734" level="INFO">GET Request : url=https://app.bitradex.mobi/v1/spot/market/public/time 
 path_url=/v1/spot/market/public/time 
 headers={'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:36.404081" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/spot/market/public/time 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:36 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0e6ba29262c-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:36.404268" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:36.404631" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/time</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="FAIL" start="2026-05-28T22:27:35.713722" elapsed="0.691399">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/time</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:36.405369" elapsed="0.000074"/>
</return>
<var>${response}</var>
<arg>/v1/spot/market/public/time</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="FAIL" start="2026-05-28T22:27:35.712967" elapsed="0.692753">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/time</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.406358" elapsed="0.000092"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.406766" elapsed="0.000051"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.407250" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.407625" elapsed="0.000042"/>
</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="NOT RUN" start="2026-05-28T22:27:36.407909" elapsed="0.000037"/>
</kw>
<kw name="验证时间数据">
<arg>${data}</arg>
<doc>验证时间数据的格式和有效性</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.408269" elapsed="0.000044"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取市场服务器时间</arg>
<arg>/v1/spot/market/public/time</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.408685" elapsed="0.000045"/>
</kw>
<doc>验证市场服务器时间接口功能</doc>
<tag>market</tag>
<status status="FAIL" start="2026-05-28T22:27:35.708244" elapsed="0.700984">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/time</status>
</test>
<doc>市场服务器时间接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:35.693330" elapsed="0.716707"/>
</suite>
<suite id="s1-s4-s2-s6" name="Market Top Symbol" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/mark/market_top_symbol.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.419949" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:36.419639" elapsed="0.000345"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.420387" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:36.420111" elapsed="0.000333"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.420752" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:36.420581" elapsed="0.000227"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:36.420481" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:36.420069" elapsed="0.000800"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.421654" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:36.421527" elapsed="0.000174"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.421960" elapsed="0.000023"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.422094" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.422223" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.422361" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.422487" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:36.421774" elapsed="0.000782"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.423039" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:36.422753" elapsed="0.000335"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.423432" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:36.423195" elapsed="0.000279"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.423820" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:36.423584" elapsed="0.000276"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.424178" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:36.423962" elapsed="0.000253"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.424522" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:36.424313" elapsed="0.000244"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.424856" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:36.424655" elapsed="0.000236"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.425249" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:36.425010" elapsed="0.000277"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.425600" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:36.425383" elapsed="0.000251"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.425948" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:36.425730" elapsed="0.000253"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:36.422588" elapsed="0.003494"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:36.426205" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.426313" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.426417" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.426531" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.426639" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.426759" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.426862" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.426966" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.427072" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:36.426107" elapsed="0.001007"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:36.421752" elapsed="0.005383"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.427372" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:36.427221" elapsed="0.000194"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:36.427899" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:36.427516" elapsed="0.000778"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:36.421238" elapsed="0.007120"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.428526" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:36.428454" elapsed="0.000104"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:36.419294" elapsed="0.009304"/>
</kw>
<test id="s1-s4-s2-s6-t1" name="获取热门市场排行榜" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.430037" level="INFO">&amp;{params} = { marketTopType=HOT }</msg>
<var>&amp;{params}</var>
<arg>marketTopType=HOT</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:36.429830" elapsed="0.000229"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.431591" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:36.431007" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.432232" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:36.431733" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:36.431706" elapsed="0.000596"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:36.432333" elapsed="0.000047"/>
</return>
<msg time="2026-05-28T22:27:36.432541" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:36.430256" elapsed="0.002306"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:36.955836" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:36.956192" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/spot/market/public/top/market-top-symbol?marketTopType=HOT 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:36 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0ebdaf6aff7-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:36.956563" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:36.956897" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/top/market-top-symbol?marketTopType=HOT</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="FAIL" start="2026-05-28T22:27:36.433465" elapsed="0.523885">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/top/market-top-symbol?marketTopType=HOT</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:36.957628" elapsed="0.000079"/>
</return>
<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="FAIL" start="2026-05-28T22:27:36.432802" elapsed="0.525189">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/top/market-top-symbol?marketTopType=HOT</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.958690" elapsed="0.000088"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.959095" elapsed="0.000053"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.959450" elapsed="0.000047"/>
</kw>
<doc>验证热门市场排行榜接口功能</doc>
<tag>market</tag>
<status status="FAIL" start="2026-05-28T22:27:36.428672" elapsed="0.531291">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/top/market-top-symbol?marketTopType=HOT</status>
</test>
<doc>热门市场排行榜接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:36.412510" elapsed="0.548281"/>
</suite>
<suite id="s1-s4-s2-s7" name="Market Trade Recent" source="/Users/lihu/.jenkins/workspace/bitradex-api-automation/tests/spot/mark/market_trade_recent.robot">
<kw name="测试环境初始化" owner="common" type="SETUP">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.972356" level="INFO">${cli_env} = prod</msg>
<var>${cli_env}</var>
<arg>\${TEST_ENV}</arg>
<arg>${env}</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-05-28T22:27:36.971950" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="'${cli_env}' == '${env}'">
<kw name="Log" owner="BuiltIn">
<arg>未检测到命令行TEST_ENV变量，使用默认值: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.972929" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:36.972580" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.973360" level="INFO">检测到命令行TEST_ENV变量: prod</msg>
<arg>检测到命令行TEST_ENV变量: ${cli_env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:36.973153" elapsed="0.000269"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:36.973038" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:36.972528" elapsed="0.000962"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.974401" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:36.974253" elapsed="0.000207"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.974761" elapsed="0.000024"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.974912" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.975057" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.975199" elapsed="0.000020"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.975341" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:36.974540" elapsed="0.000863"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.975943" level="INFO">${BASE_URL} = https://app.bitradex.mobi</msg>
<arg>${BASE_URL}</arg>
<arg>https://app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:36.975625" elapsed="0.000372"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.976413" level="INFO">${ENV_NAME} = 生产环境</msg>
<arg>${ENV_NAME}</arg>
<arg>生产环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:36.976127" elapsed="0.000334"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.976845" level="INFO">${TIMEOUT} = 30</msg>
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:36.976586" elapsed="0.000326"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.977300" level="INFO">${HOST_NAME} = app.bitradex.mobi</msg>
<arg>${HOST_NAME}</arg>
<arg>app.bitradex.mobi</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:36.977052" elapsed="0.000289"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.977673" level="INFO">${APP_PREFIX} = Prod</msg>
<arg>${APP_PREFIX}</arg>
<arg>Prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:36.977449" elapsed="0.000263"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.978045" level="INFO">${CLIENT_CODE} = 9F387CCE-760C-4AED-80BB-787B82D2C94D</msg>
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:36.977818" elapsed="0.000327"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.978521" level="INFO">${DEFAULT_APP_VERSION} = 1.1.9</msg>
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.1.9</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:36.978258" elapsed="0.000301"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.978901" level="INFO">${DEFAULT_BUILD_CODE} = 7032</msg>
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7032</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:36.978667" elapsed="0.000271"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.979291" level="INFO">${DEFAULT_APP_CHANNEL} = ios-prod</msg>
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-prod</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="PASS" start="2026-05-28T22:27:36.979046" elapsed="0.000282"/>
</kw>
<status status="PASS" start="2026-05-28T22:27:36.975445" elapsed="0.003919"/>
</branch>
<branch type="ELSE">
<kw name="Set Global Variable" owner="BuiltIn">
<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="NOT RUN" start="2026-05-28T22:27:36.979496" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>BitRadeX测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.979618" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${TIMEOUT}</arg>
<arg>30</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.979753" elapsed="0.000018"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>app.bitradex-test.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.979874" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.979993" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.980111" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_VERSION}</arg>
<arg>1.2.0</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.980226" elapsed="0.000019"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_BUILD_CODE}</arg>
<arg>7034</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.980344" elapsed="0.000017"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${DEFAULT_APP_CHANNEL}</arg>
<arg>ios-test-flight</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.980464" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:36.979391" elapsed="0.001124"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:36.974519" elapsed="0.006017"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.980803" level="INFO">已设置测试环境: 生产环境 (https://app.bitradex.mobi)</msg>
<arg>已设置测试环境: ${ENV_NAME} (${BASE_URL})</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:36.980637" elapsed="0.000215"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:36.981415" level="INFO">Creating Session using : alias=api_session, url=https://app.bitradex.mobi, headers={},                     cookies={}, auth=None, timeout=30, proxies=None, verify=False,                     debug=1 </msg>
<arg>api_session</arg>
<arg>${BASE_URL}</arg>
<arg>timeout=${TIMEOUT}</arg>
<arg>debug=1</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-05-28T22:27:36.980980" elapsed="0.000674"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T22:27:36.973926" elapsed="0.007787"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.981882" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T22:27:36.981807" elapsed="0.000108"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T22:27:36.971483" elapsed="0.010476"/>
</kw>
<test id="s1-s4-s2-s7-t1" name="获取最近交易记录" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.983333" level="INFO">&amp;{params} = { symbol=btc_usdt | limit=30 }</msg>
<var>&amp;{params}</var>
<arg>symbol=btc_usdt</arg>
<arg>limit=30</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:36.983116" elapsed="0.000240"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T22:27:36.984973" level="INFO">&amp;{headers} = { user-agent=BitradeX-Prod 1.1.9(7032);iPhone | app-version-name=1.1.9 | client-lang=cn | check_agent=app_traffic | api-version=1 | content-type=application/json | app-version-code=7032 | app-channel=...</msg>
<var>&amp;{headers}</var>
<arg>user-agent=BitradeX-${APP_PREFIX} ${app_version}(${build_code});iPhone</arg>
<arg>app-version-name=${app_version}</arg>
<arg>client-lang=cn</arg>
<arg>check_agent=app_traffic</arg>
<arg>api-version=1</arg>
<arg>content-type=application/json</arg>
<arg>app-version-code=${build_code}</arg>
<arg>app-channel=${app_channel}</arg>
<arg>app-os=ios</arg>
<arg>platform=USER</arg>
<arg>client-code=${CLIENT_CODE}</arg>
<arg>client-device-name=iPhone</arg>
<arg>accept=application/json, text/plain, */*</arg>
<arg>lang=cn</arg>
<arg>accept-language=zh_CN</arg>
<arg>platform-account-id=9</arg>
<arg>tenant-id=1</arg>
<arg>device=app</arg>
<arg>host=${HOST_NAME}</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-05-28T22:27:36.984393" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:36.985633" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T22:27:36.985121" elapsed="0.000560"/>
</branch>
<status status="PASS" start="2026-05-28T22:27:36.985101" elapsed="0.000651"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T22:27:36.985824" elapsed="0.000047"/>
</return>
<msg time="2026-05-28T22:27:36.986125" level="INFO">${headers} = {'user-agent': 'BitradeX-Prod 1.1.9(7032);iPhone', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-...</msg>
<var>${headers}</var>
<doc>获取统一的应用请求头配置</doc>
<status status="PASS" start="2026-05-28T22:27:36.983567" elapsed="0.002594"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T22:27:38.415490" level="INFO">GET Request : url=https://app.bitradex.mobi/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-Prod 1.1.9(7032);iPhone', 'Accept-Encoding': 'gzip, deflate', 'accept': 'application/json, text/plain, */*', 'Connection': 'keep-alive', 'app-version-name': '1.1.9', 'client-lang': 'cn', 'check_agent': 'app_traffic', 'api-version': '1', 'content-type': 'application/json', 'app-version-code': '7032', 'app-channel': 'ios-prod', '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.mobi'} 
 body=None 
 </msg>
<msg time="2026-05-28T22:27:38.415865" level="INFO">GET Response : url=https://app.bitradex.mobi/v1/spot/market/public/trade/recent?symbol=btc_usdt&amp;limit=30 
 status=456, reason=&lt;none&gt; 
 headers={'Date': 'Thu, 28 May 2026 14:27:38 GMT', 'Content-Type': 'text/plain', 'Content-Length': '3', 'Connection': 'keep-alive', 'Cache-Control': 'private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Expires': 'Thu, 01 Jan 1970 00:00:01 GMT', 'Referrer-Policy': 'same-origin', 'X-Frame-Options': 'SAMEORIGIN', 'Server': 'cloudflare', 'CF-RAY': 'a02df0f4f880afff-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T22:27:38.416097" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(</msg>
<msg time="2026-05-28T22:27:38.416506" level="FAIL">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/trade/recent?symbol=btc_usdt&amp;limit=30</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="FAIL" start="2026-05-28T22:27:36.986946" elapsed="1.430085">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/trade/recent?symbol=btc_usdt&amp;limit=30</status>
</kw>
<return>
<value>${response}</value>
<status status="NOT RUN" start="2026-05-28T22:27:38.417327" elapsed="0.000091"/>
</return>
<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="FAIL" start="2026-05-28T22:27:36.986408" elapsed="1.431309">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/trade/recent?symbol=btc_usdt&amp;limit=30</status>
</kw>
<kw name="验证接口响应成功" owner="common">
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="NOT RUN" start="2026-05-28T22:27:38.418461" elapsed="0.000089"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T22:27:38.418855" elapsed="0.000053"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T22:27:38.419206" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${data}</var>
<arg>${response.json()}</arg>
<arg>data</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-05-28T22:27:38.419588" elapsed="0.000042"/>
</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="NOT RUN" start="2026-05-28T22:27:38.419883" elapsed="0.000040"/>
</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="NOT RUN" start="2026-05-28T22:27:38.420207" elapsed="0.000038"/>
</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="NOT RUN" start="2026-05-28T22:27:38.420485" elapsed="0.000037"/>
</kw>
<kw name="本次测试简报" owner="common">
<arg>获取最近交易记录</arg>
<arg>/v1/spot/market/public/trade/recent</arg>
<arg>${response}</arg>
<doc>根据测试执行情况自动生成详细的测试过程总结</doc>
<status status="NOT RUN" start="2026-05-28T22:27:38.420908" elapsed="0.000048"/>
</kw>
<doc>验证最近交易记录接口功能</doc>
<tag>market</tag>
<status status="FAIL" start="2026-05-28T22:27:36.982032" elapsed="1.439436">HTTPError: 456 Client Error: &lt;none&gt; for url: https://app.bitradex.mobi/v1/spot/market/public/trade/recent?symbol=btc_usdt&amp;limit=30</status>
</test>
<doc>最近交易记录接口测试</doc>
<status status="FAIL" start="2026-05-28T22:27:36.963346" elapsed="1.458946"/>
</suite>
<status status="FAIL" start="2026-05-28T22:27:32.269534" elapsed="6.155146"/>
</suite>
<status status="FAIL" start="2026-05-28T22:27:30.154287" elapsed="8.271705"/>
</suite>
<status status="FAIL" start="2026-05-28T22:27:08.481456" elapsed="29.946383"/>
</suite>
<statistics>
<total>
<stat pass="0" fail="53" skip="0">All Tests</stat>
</total>
<tag>
<stat pass="0" fail="8" skip="0">app</stat>
<stat pass="0" fail="34" skip="0">future-u</stat>
<stat pass="0" fail="1" skip="0">invite</stat>
<stat pass="0" fail="7" skip="0">market</stat>
<stat pass="0" fail="1" skip="0">profit</stat>
<stat pass="0" fail="3" skip="0">spot</stat>
</tag>
<suite>
<stat name="BitRadeX_API测试_prod" id="s1" pass="0" fail="53" skip="0">BitRadeX_API测试_prod</stat>
<stat name="App" id="s1-s1" pass="0" fail="8" skip="0">BitRadeX_API测试_prod.App</stat>
<stat name="Ad List" id="s1-s1-s1" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.App.Ad List</stat>
<stat name="App Share Info" id="s1-s1-s2" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.App.App Share Info</stat>
<stat name="App Version Info" id="s1-s1-s3" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.App.App Version Info</stat>
<stat name="Banner List" id="s1-s1-s4" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.App.Banner List</stat>
<stat name="Captcha Apply" id="s1-s1-s5" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.App.Captcha Apply</stat>
<stat name="Open Screen List" id="s1-s1-s6" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.App.Open Screen List</stat>
<stat name="Open Screen List Lang" id="s1-s1-s7" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.App.Open Screen List Lang</stat>
<stat name="Vajra District" id="s1-s1-s8" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.App.Vajra District</stat>
<stat name="Future-U" id="s1-s2" pass="0" fail="34" skip="0">BitRadeX_API测试_prod.Future-U</stat>
<stat name="Market" id="s1-s2-s1" pass="0" fail="2" skip="0">BitRadeX_API测试_prod.Future-U.Market</stat>
<stat name="Future U Symbol Detail" id="s1-s2-s1-s1" pass="0" fail="2" skip="0">BitRadeX_API测试_prod.Future-U.Market.Future U Symbol Detail</stat>
<stat name="Q" id="s1-s2-s2" pass="0" fail="32" skip="0">BitRadeX_API测试_prod.Future-U.Q</stat>
<stat name="Future U Depth" id="s1-s2-s2-s1" pass="0" fail="6" skip="0">BitRadeX_API测试_prod.Future-U.Q.Future U Depth</stat>
<stat name="Future U Funding Rate" id="s1-s2-s2-s2" pass="0" fail="5" skip="0">BitRadeX_API测试_prod.Future-U.Q.Future U Funding Rate</stat>
<stat name="Future U Index Price" id="s1-s2-s2-s3" pass="0" fail="7" skip="0">BitRadeX_API测试_prod.Future-U.Q.Future U Index Price</stat>
<stat name="Future U Mark Price" id="s1-s2-s2-s4" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.Future-U.Q.Future U Mark Price</stat>
<stat name="Future U Symbol Mark Price" id="s1-s2-s2-s5" pass="0" fail="5" skip="0">BitRadeX_API测试_prod.Future-U.Q.Future U Symbol Mark Price</stat>
<stat name="Future U Ticker" id="s1-s2-s2-s6" pass="0" fail="5" skip="0">BitRadeX_API测试_prod.Future-U.Q.Future U Ticker</stat>
<stat name="Future U Tickers" id="s1-s2-s2-s7" pass="0" fail="3" skip="0">BitRadeX_API测试_prod.Future-U.Q.Future U Tickers</stat>
<stat name="Invite" id="s1-s3" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.Invite</stat>
<stat name="Profit Analysis" id="s1-s3-s1" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.Invite.Profit Analysis</stat>
<stat name="Spot" id="s1-s4" pass="0" fail="10" skip="0">BitRadeX_API测试_prod.Spot</stat>
<stat name="Balance" id="s1-s4-s1" pass="0" fail="3" skip="0">BitRadeX_API测试_prod.Spot.Balance</stat>
<stat name="Balance Currencies" id="s1-s4-s1-s1" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.Spot.Balance.Balance Currencies</stat>
<stat name="Balance Price Convert" id="s1-s4-s1-s2" pass="0" fail="2" skip="0">BitRadeX_API测试_prod.Spot.Balance.Balance Price Convert</stat>
<stat name="Mark" id="s1-s4-s2" pass="0" fail="7" skip="0">BitRadeX_API测试_prod.Spot.Mark</stat>
<stat name="24H Market" id="s1-s4-s2-s1" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.Spot.Mark.24H Market</stat>
<stat name="Market Depth" id="s1-s4-s2-s2" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.Spot.Mark.Market Depth</stat>
<stat name="Market Plate" id="s1-s4-s2-s3" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.Spot.Mark.Market Plate</stat>
<stat name="Market Symbol" id="s1-s4-s2-s4" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.Spot.Mark.Market Symbol</stat>
<stat name="Market Time" id="s1-s4-s2-s5" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.Spot.Mark.Market Time</stat>
<stat name="Market Top Symbol" id="s1-s4-s2-s6" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.Spot.Mark.Market Top Symbol</stat>
<stat name="Market Trade Recent" id="s1-s4-s2-s7" pass="0" fail="1" skip="0">BitRadeX_API测试_prod.Spot.Mark.Market Trade Recent</stat>
</suite>
</statistics>
<errors>
</errors>
</robot>
