<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.3.2 (Python 3.9.6 on darwin)" generated="2026-05-28T23:27:07.859787" 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-28T23:27:07.953836" 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-28T23:27:07.953739" elapsed="0.000114"/>
</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-28T23:27:07.953984" elapsed="0.000008"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:07.953896" elapsed="0.000111"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:07.954116" 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-28T23:27:07.954055" elapsed="0.000080"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:07.954016" elapsed="0.000133"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:07.953885" elapsed="0.000271"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:07.954426" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:07.954376" elapsed="0.000067"/>
</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-28T23:27:07.954530" elapsed="0.000007"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:07.954577" 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-28T23:27:07.954620" 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-28T23:27:07.954662" 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-28T23:27:07.954704" elapsed="0.000006"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:07.954468" elapsed="0.000254"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:07.955090" 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-28T23:27:07.954787" elapsed="0.000321"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:07.955402" 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-28T23:27:07.955151" elapsed="0.000268"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:07.955706" 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-28T23:27:07.955461" elapsed="0.000262"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:07.956013" 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-28T23:27:07.955765" elapsed="0.000264"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:07.956323" 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-28T23:27:07.956070" elapsed="0.000269"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:07.956650" 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-28T23:27:07.956380" elapsed="0.000286"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:07.956964" 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-28T23:27:07.956707" elapsed="0.000275"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:07.957285" 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-28T23:27:07.957027" elapsed="0.000274"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:07.957602" 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-28T23:27:07.957341" elapsed="0.000278"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:07.954730" elapsed="0.002904"/>
</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-28T23:27:07.957682" 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-28T23:27:07.957729" 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-28T23:27:07.957773" 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-28T23:27:07.957816" elapsed="0.000006"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:07.957862" 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-28T23:27:07.957906" elapsed="0.000095"/>
</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-28T23:27:07.958041" elapsed="0.000006"/>
</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-28T23:27:07.958084" 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-28T23:27:07.958126" elapsed="0.000006"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:07.957644" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:07.954461" elapsed="0.003690"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:07.958246" 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-28T23:27:07.958185" elapsed="0.000077"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:07.958423" 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-28T23:27:07.958305" elapsed="0.000203"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:07.954272" elapsed="0.004263"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:07.958612" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:07.958578" elapsed="0.000050"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:07.953412" elapsed="0.005236"/>
</kw>
<test id="s1-s1-s1-t1" name="获取广告列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:07.959700" 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-28T23:27:07.959400" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:07.959973" elapsed="0.000009"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:07.959759" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:07.959752" elapsed="0.000255"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:07.960022" elapsed="0.000017"/>
</return>
<msg time="2026-05-28T23:27:07.960111" 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-28T23:27:07.959112" elapsed="0.001010"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:08.542423" 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-28T23:27:08.542753" 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 15:27:08 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': 'a02e481e4b479bd1-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:08.542890" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:08.543155" 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-28T23:27:07.960164" elapsed="0.583024"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T23:27:08.544061" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-05-28T23:27:08.544180" 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-28T23:27:08.543440" elapsed="0.000814">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-28T23:27:08.544402" elapsed="0.000022"/>
</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-28T23:27:08.544521" elapsed="0.000016"/>
</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-28T23:27:08.544692" elapsed="0.000017"/>
</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-28T23:27:08.544856" 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-28T23:27:08.545163" elapsed="0.000107"/>
</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-28T23:27:08.545605" elapsed="0.000052"/>
</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-28T23:27:08.545918" elapsed="0.000040"/>
</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-28T23:27:08.546193" elapsed="0.000038"/>
</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-28T23:27:08.546451" elapsed="0.000038"/>
</kw>
<doc>验证广告列表接口功能</doc>
<tag>app</tag>
<status status="FAIL" start="2026-05-28T23:27:07.958675" elapsed="0.588217">456 != 200</status>
</test>
<doc>广告列表接口测试</doc>
<status status="FAIL" start="2026-05-28T23:27:07.869722" elapsed="0.677964"/>
</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-28T23:27:08.555703" 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-28T23:27:08.555305" elapsed="0.000463"/>
</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-28T23:27:08.556190" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:08.555924" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:08.556537" 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-28T23:27:08.556364" elapsed="0.000224"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:08.556273" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:08.555893" elapsed="0.000747"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:08.557345" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:08.557204" elapsed="0.000193"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:08.557679" 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-28T23:27:08.557836" 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-28T23:27:08.557975" 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-28T23:27:08.558116" 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-28T23:27:08.558252" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:08.557472" elapsed="0.000840"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:08.560544" 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-28T23:27:08.558521" elapsed="0.002081"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:08.560949" 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-28T23:27:08.560745" elapsed="0.000241"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:08.561273" 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-28T23:27:08.561091" elapsed="0.000217"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:08.561603" 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-28T23:27:08.561417" elapsed="0.000219"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:08.561925" 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-28T23:27:08.561732" elapsed="0.000230"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:08.562256" 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-28T23:27:08.562062" elapsed="0.000229"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:08.562588" 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-28T23:27:08.562390" elapsed="0.000231"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:08.562905" 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-28T23:27:08.562718" elapsed="0.000220"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:08.563394" 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-28T23:27:08.563187" elapsed="0.000241"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:08.558339" elapsed="0.005125"/>
</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-28T23:27:08.563615" 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-28T23:27:08.563724" 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-28T23:27:08.563830" 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-28T23:27:08.563941" 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-28T23:27:08.564046" 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-28T23:27:08.564154" 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-28T23:27:08.564255" 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-28T23:27:08.564367" 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-28T23:27:08.564483" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:08.563506" elapsed="0.001023"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:08.557452" elapsed="0.007102"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:08.564941" 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-28T23:27:08.564658" elapsed="0.000342"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:08.565584" 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-28T23:27:08.565130" elapsed="0.000699"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:08.556957" elapsed="0.008956"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:08.566149" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:08.566033" elapsed="0.000163"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:08.554637" elapsed="0.011690"/>
</kw>
<test id="s1-s1-s2-t1" name="获取应用分享信息" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:08.569777" 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-28T23:27:08.569119" elapsed="0.000685"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:08.570410" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:08.569910" elapsed="0.000580"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:08.569892" elapsed="0.000625"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:08.570559" elapsed="0.000039"/>
</return>
<msg time="2026-05-28T23:27:08.570812" 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-28T23:27:08.567984" elapsed="0.002861"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:09.050685" 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-28T23:27:09.051097" 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 15:27:09 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': 'a02e48217e9a49a8-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:09.051532" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:09.051813" 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-28T23:27:08.571920" elapsed="0.488486">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-28T23:27:09.060605" elapsed="0.000053"/>
</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-28T23:27:08.571052" elapsed="0.489754">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-28T23:27:09.061105" elapsed="0.000034"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T23:27:09.061264" elapsed="0.000020"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T23:27:09.061393" elapsed="0.000020"/>
</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-28T23:27:09.061570" elapsed="0.000024"/>
</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-28T23:27:09.061702" elapsed="0.000015"/>
</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-28T23:27:09.061819" elapsed="0.000014"/>
</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-28T23:27:09.061992" elapsed="0.000021"/>
</kw>
<doc>验证应用分享信息接口功能</doc>
<tag>app</tag>
<status status="FAIL" start="2026-05-28T23:27:08.566418" elapsed="0.495793">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-28T23:27:08.549080" elapsed="0.513783"/>
</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-28T23:27:09.070731" 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-28T23:27:09.070445" elapsed="0.000329"/>
</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-28T23:27:09.071171" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:09.070895" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.071569" 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-28T23:27:09.071384" elapsed="0.000252"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:09.071272" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:09.070864" elapsed="0.000842"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.072637" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:09.072502" elapsed="0.000183"/>
</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-28T23:27:09.072943" 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-28T23:27:09.073064" 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-28T23:27:09.073184" elapsed="0.000062"/>
</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-28T23:27:09.073445" elapsed="0.000035"/>
</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-28T23:27:09.073640" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:09.072750" elapsed="0.000968"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.074365" 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-28T23:27:09.074013" elapsed="0.000413"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.074787" 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-28T23:27:09.074560" elapsed="0.000269"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.075173" 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-28T23:27:09.074951" elapsed="0.000265"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.075672" 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-28T23:27:09.075449" elapsed="0.000263"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.076043" 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-28T23:27:09.075827" elapsed="0.000263"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.076441" 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-28T23:27:09.076217" elapsed="0.000272"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.076822" 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-28T23:27:09.076613" elapsed="0.000244"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.077134" 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-28T23:27:09.076953" elapsed="0.000213"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.077436" 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-28T23:27:09.077259" elapsed="0.000207"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:09.073761" elapsed="0.003736"/>
</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-28T23:27:09.077614" 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-28T23:27:09.077719" 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-28T23:27:09.077851" 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-28T23:27:09.077972" 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-28T23:27:09.078092" 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-28T23:27:09.078211" elapsed="0.000019"/>
</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-28T23:27:09.078339" 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-28T23:27:09.078456" 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-28T23:27:09.078572" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:09.077527" elapsed="0.001096"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:09.072733" elapsed="0.005913"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.078954" 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-28T23:27:09.078752" elapsed="0.000251"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:09.079410" 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-28T23:27:09.079101" elapsed="0.000525"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:09.072122" elapsed="0.007584"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.079912" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:09.079815" elapsed="0.000137"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:09.070063" elapsed="0.009948"/>
</kw>
<test id="s1-s1-s3-t1" name="获取应用版本信息" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.083131" 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-28T23:27:09.082270" elapsed="0.000891"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:09.084217" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:09.083441" elapsed="0.000865"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:09.083398" elapsed="0.000936"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:09.084464" elapsed="0.000044"/>
</return>
<msg time="2026-05-28T23:27:09.084811" 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-28T23:27:09.081495" elapsed="0.003352"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:09.579005" 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-28T23:27:09.579249" 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 15:27:09 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': 'a02e4824ca5fc087-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:09.579392" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:09.579688" 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-28T23:27:09.085996" elapsed="0.494027">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-28T23:27:09.580206" elapsed="0.000069"/>
</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-28T23:27:09.085054" elapsed="0.495412">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-28T23:27:09.580992" elapsed="0.000079"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T23:27:09.581267" elapsed="0.000022"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T23:27:09.581416" elapsed="0.000030"/>
</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-28T23:27:09.581583" elapsed="0.000019"/>
</kw>
<doc>验证应用版本信息接口功能</doc>
<tag>app</tag>
<status status="FAIL" start="2026-05-28T23:27:09.080103" elapsed="0.501770">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-28T23:27:09.064707" elapsed="0.517722"/>
</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-28T23:27:09.591229" 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-28T23:27:09.590840" elapsed="0.000454"/>
</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-28T23:27:09.591862" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:09.591474" elapsed="0.000476"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.592313" 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-28T23:27:09.592137" elapsed="0.000232"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:09.591993" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:09.591429" elapsed="0.000992"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.593086" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:09.592990" elapsed="0.000132"/>
</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-28T23:27:09.593325" 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-28T23:27:09.593427" 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-28T23:27:09.593521" 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-28T23:27:09.593617" 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-28T23:27:09.593711" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:09.593178" elapsed="0.000671"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.594207" 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-28T23:27:09.593997" elapsed="0.000245"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.594493" 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-28T23:27:09.594329" elapsed="0.000195"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.594768" 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-28T23:27:09.594610" elapsed="0.000188"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.595045" 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-28T23:27:09.594885" elapsed="0.000190"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.595321" 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-28T23:27:09.595160" elapsed="0.000191"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.595600" 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-28T23:27:09.595437" elapsed="0.000193"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.595958" 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-28T23:27:09.595715" elapsed="0.000289"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.596405" 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-28T23:27:09.596132" elapsed="0.000321"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.596792" 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-28T23:27:09.596570" elapsed="0.000261"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:09.593872" elapsed="0.002996"/>
</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-28T23:27:09.596995" 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-28T23:27:09.597119" 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-28T23:27:09.597239" 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-28T23:27:09.597359" 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-28T23:27:09.597482" 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-28T23:27:09.597583" 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-28T23:27:09.597674" 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-28T23:27:09.597764" 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-28T23:27:09.597855" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:09.596894" elapsed="0.000999"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:09.593161" elapsed="0.004749"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.598131" 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-28T23:27:09.597999" elapsed="0.000168"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:09.598632" 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-28T23:27:09.598272" elapsed="0.000613"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:09.592737" elapsed="0.006227"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.599172" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:09.599081" elapsed="0.000134"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:09.589757" elapsed="0.009525"/>
</kw>
<test id="s1-s1-s4-t1" name="获取Banner列表" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.600573" 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-28T23:27:09.600357" elapsed="0.000253"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:09.602121" 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-28T23:27:09.601536" elapsed="0.000657"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:09.602807" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:09.602314" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:09.602295" elapsed="0.000589"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:09.602918" elapsed="0.000040"/>
</return>
<msg time="2026-05-28T23:27:09.603122" 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-28T23:27:09.600836" elapsed="0.002310"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:10.550654" 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-28T23:27:10.550949" 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 15:27:09 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': 'a02e48277b31c368-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:10.551107" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:10.551462" 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-28T23:27:09.603247" elapsed="0.948296"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T23:27:10.552596" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-05-28T23:27:10.552834" 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-28T23:27:10.551899" elapsed="0.001079">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-28T23:27:10.553297" elapsed="0.000047"/>
</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-28T23:27:10.553598" 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-28T23:27:10.553872" 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-28T23:27:10.554134" 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-28T23:27:10.554393" elapsed="0.000043"/>
</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-28T23:27:10.554745" elapsed="0.000099"/>
</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-28T23:27:10.555239" elapsed="0.000072"/>
</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-28T23:27:10.555653" elapsed="0.000061"/>
</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-28T23:27:10.555967" elapsed="0.000036"/>
</kw>
<doc>验证Banner列表接口功能</doc>
<tag>app</tag>
<status status="FAIL" start="2026-05-28T23:27:09.599357" elapsed="0.957162">456 != 200</status>
</test>
<doc>Banner列表接口测试</doc>
<status status="FAIL" start="2026-05-28T23:27:09.583699" elapsed="0.973693"/>
</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-28T23:27:10.566463" 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-28T23:27:10.566237" elapsed="0.000291"/>
</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-28T23:27:10.567283" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:10.566933" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:10.567730" 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-28T23:27:10.567459" elapsed="0.000383"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:10.567377" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:10.566845" elapsed="0.001107"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:10.569125" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:10.568980" 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-28T23:27:10.569471" 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-28T23:27:10.569573" 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-28T23:27:10.569672" 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-28T23:27:10.569763" elapsed="0.000012"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:10.569853" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:10.569263" elapsed="0.000628"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:10.570341" 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-28T23:27:10.570051" elapsed="0.000331"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:10.570885" 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-28T23:27:10.570590" elapsed="0.000348"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:10.571263" 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-28T23:27:10.571087" elapsed="0.000208"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:10.571561" 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-28T23:27:10.571394" elapsed="0.000198"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:10.572116" 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-28T23:27:10.571684" elapsed="0.000470"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:10.572446" 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-28T23:27:10.572268" elapsed="0.000214"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:10.572785" 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-28T23:27:10.572602" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:10.573096" 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-28T23:27:10.572918" elapsed="0.000206"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:10.573394" 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-28T23:27:10.573213" elapsed="0.000211"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:10.569914" elapsed="0.003541"/>
</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-28T23:27:10.573598" 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-28T23:27:10.573691" 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-28T23:27:10.573783" elapsed="0.000012"/>
</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-28T23:27:10.573872" 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-28T23:27:10.573960" elapsed="0.000012"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:10.574065" 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-28T23:27:10.574184" 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-28T23:27:10.574271" 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-28T23:27:10.574357" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:10.573496" elapsed="0.001021"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:10.569240" elapsed="0.005298"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:10.574860" 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-28T23:27:10.574636" elapsed="0.000274"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:10.575376" 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-28T23:27:10.575019" elapsed="0.000605"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:10.568470" elapsed="0.007238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:10.575894" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:10.575813" elapsed="0.000118"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:10.565892" elapsed="0.010091"/>
</kw>
<test id="s1-s1-s5-t1" name="申请验证码" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:10.577491" 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-28T23:27:10.577258" elapsed="0.000256"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:10.579795" 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-28T23:27:10.578983" elapsed="0.000855"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:10.580666" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:10.580006" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:10.579976" elapsed="0.000793"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:10.580807" elapsed="0.000038"/>
</return>
<msg time="2026-05-28T23:27:10.581052" 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-28T23:27:10.577916" elapsed="0.003174"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:12.298880" 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-28T23:27:12.299049" 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 15: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': 'a02e4835ce1aa562-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:12.299158" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:12.299501" 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-28T23:27:10.581784" elapsed="1.717955">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-28T23:27:12.299857" elapsed="0.000032"/>
</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-28T23:27:10.581274" elapsed="1.718724">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-28T23:27:12.300288" elapsed="0.000030"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T23:27:12.300431" elapsed="0.000018"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T23:27:12.300554" elapsed="0.000017"/>
</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-28T23:27:12.300717" elapsed="0.000027"/>
</kw>
<doc>验证验证码请求接口功能</doc>
<tag>app</tag>
<status status="FAIL" start="2026-05-28T23:27:10.576081" elapsed="1.725054">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-28T23:27:10.559308" elapsed="1.742416"/>
</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-28T23:27:12.309794" 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-28T23:27:12.309562" elapsed="0.000282"/>
</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-28T23:27:12.310216" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:12.309983" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.310521" 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-28T23:27:12.310373" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:12.310292" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:12.309943" elapsed="0.000669"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.311257" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:12.311132" elapsed="0.000170"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:12.311543" 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-28T23:27:12.311660" 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-28T23:27:12.311769" 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-28T23:27:12.311875" 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-28T23:27:12.311979" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:12.311369" elapsed="0.000657"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.312430" 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-28T23:27:12.312211" elapsed="0.000255"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.312747" 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-28T23:27:12.312566" elapsed="0.000215"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.313050" 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-28T23:27:12.312875" elapsed="0.000209"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.313363" 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-28T23:27:12.313176" elapsed="0.000220"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.313667" 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-28T23:27:12.313488" elapsed="0.000212"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.313976" 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-28T23:27:12.313794" elapsed="0.000215"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.314296" 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-28T23:27:12.314101" elapsed="0.000224"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.314577" 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-28T23:27:12.314409" elapsed="0.000201"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.314864" 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-28T23:27:12.314695" elapsed="0.000197"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:12.312048" elapsed="0.002872"/>
</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-28T23:27:12.315038" 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-28T23:27:12.315146" 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-28T23:27:12.315240" 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-28T23:27:12.315330" 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-28T23:27:12.315419" elapsed="0.000098"/>
</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-28T23:27:12.315612" 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-28T23:27:12.315706" 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-28T23:27:12.315797" 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-28T23:27:12.315898" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:12.314959" elapsed="0.000980"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:12.311349" elapsed="0.004610"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.316439" 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-28T23:27:12.316082" elapsed="0.000428"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:12.317086" 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-28T23:27:12.316666" elapsed="0.000667"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:12.310883" elapsed="0.006535"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.317667" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:12.317563" elapsed="0.000139"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:12.309175" elapsed="0.008582"/>
</kw>
<test id="s1-s1-s6-t1" name="获取开屏广告列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.321397" 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-28T23:27:12.320517" elapsed="0.000935"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:12.322310" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:12.321627" elapsed="0.000763"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:12.321599" elapsed="0.000819"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:12.322459" elapsed="0.000039"/>
</return>
<msg time="2026-05-28T23:27:12.322711" 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-28T23:27:12.319330" elapsed="0.003411"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:12.776322" 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-28T23:27:12.776674" 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 15: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': 'a02e4838bfd2eb9a-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:12.776831" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:12.777109" 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-28T23:27:12.323950" elapsed="0.453475">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-28T23:27:12.777553" elapsed="0.000046"/>
</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-28T23:27:12.322939" elapsed="0.454838">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-28T23:27:12.778543" elapsed="0.000083"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T23:27:12.778948" elapsed="0.000062"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T23:27:12.779302" elapsed="0.000049"/>
</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-28T23:27:12.779666" elapsed="0.000049"/>
</kw>
<doc>验证开屏广告列表接口功能</doc>
<tag>app</tag>
<status status="FAIL" start="2026-05-28T23:27:12.317858" elapsed="0.462300">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-28T23:27:12.302815" elapsed="0.478093"/>
</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-28T23:27:12.790257" 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-28T23:27:12.789910" elapsed="0.000397"/>
</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-28T23:27:12.790746" elapsed="0.000422"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:12.790452" elapsed="0.000770"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.791684" 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-28T23:27:12.791415" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:12.791261" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:12.790416" elapsed="0.001429"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.792861" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:12.792691" elapsed="0.000230"/>
</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-28T23:27:12.793239" elapsed="0.000030"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:12.793385" 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-28T23:27:12.793480" 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-28T23:27:12.793571" 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-28T23:27:12.793663" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:12.793009" elapsed="0.000693"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.794092" 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-28T23:27:12.793855" elapsed="0.000285"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.794489" 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-28T23:27:12.794263" elapsed="0.000265"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.794851" 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-28T23:27:12.794640" elapsed="0.000249"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.795214" 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-28T23:27:12.795001" elapsed="0.000252"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.795566" 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-28T23:27:12.795359" elapsed="0.000248"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.795939" 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-28T23:27:12.795720" elapsed="0.000260"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.796325" 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-28T23:27:12.796092" elapsed="0.000277"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.796742" 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-28T23:27:12.796494" elapsed="0.000289"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.797130" 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-28T23:27:12.796902" elapsed="0.000266"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:12.793723" elapsed="0.003481"/>
</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-28T23:27:12.797355" elapsed="0.000026"/>
</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-28T23:27:12.797553" 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-28T23:27:12.797657" 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-28T23:27:12.797760" 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-28T23:27:12.797856" 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-28T23:27:12.797949" 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-28T23:27:12.798045" 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-28T23:27:12.798140" 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-28T23:27:12.798236" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:12.797235" elapsed="0.001041"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:12.792983" elapsed="0.005315"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.798608" 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-28T23:27:12.798387" elapsed="0.000275"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:12.799156" 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-28T23:27:12.798772" elapsed="0.000645"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:12.792302" elapsed="0.007185"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.799677" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:12.799589" elapsed="0.000127"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:12.789329" elapsed="0.010441"/>
</kw>
<test id="s1-s1-s7-t1" name="获取开屏广告语言列表" line="7">
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:12.803260" 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-28T23:27:12.802370" elapsed="0.000947"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:12.804177" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:12.803498" elapsed="0.000754"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:12.803465" elapsed="0.000812"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:12.804317" elapsed="0.000038"/>
</return>
<msg time="2026-05-28T23:27:12.804557" 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-28T23:27:12.801504" elapsed="0.003080"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:15.313669" 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-28T23:27:15.314042" 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 15: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': 'a02e4848a838afd3-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:15.314216" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:15.314521" 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-28T23:27:12.805544" elapsed="2.509371">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-28T23:27:15.315168" elapsed="0.000072"/>
</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-28T23:27:12.804782" elapsed="2.510700">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-28T23:27:15.315948" elapsed="0.000059"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T23:27:15.316158" elapsed="0.000022"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T23:27:15.316368" elapsed="0.000386"/>
</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-28T23:27:15.316890" elapsed="0.000017"/>
</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-28T23:27:15.316994" 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-28T23:27:15.317104" elapsed="0.000014"/>
</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-28T23:27:15.317212" elapsed="0.000021"/>
</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-28T23:27:15.317406" elapsed="0.000021"/>
</kw>
<doc>验证开屏广告语言列表接口功能</doc>
<tag>app</tag>
<status status="FAIL" start="2026-05-28T23:27:12.799845" elapsed="2.517972">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-28T23:27:12.781928" elapsed="2.536766"/>
</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-28T23:27:15.326585" 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-28T23:27:15.326264" 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-28T23:27:15.326978" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:15.326765" elapsed="0.000258"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:15.327261" 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-28T23:27:15.327126" elapsed="0.000175"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:15.327046" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:15.326731" elapsed="0.000615"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:15.328232" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:15.327940" elapsed="0.000334"/>
</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-28T23:27:15.328485" 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-28T23:27:15.328588" 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-28T23:27:15.328682" 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-28T23:27:15.328775" 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-28T23:27:15.328866" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:15.328334" elapsed="0.000571"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:15.329234" 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-28T23:27:15.329046" elapsed="0.000220"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:15.329512" 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-28T23:27:15.329352" elapsed="0.000190"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:15.329777" 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-28T23:27:15.329624" elapsed="0.000182"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:15.330066" 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-28T23:27:15.329888" elapsed="0.000251"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:15.330544" 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-28T23:27:15.330294" elapsed="0.000373"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:15.331007" 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-28T23:27:15.330794" elapsed="0.000245"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:15.331309" 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-28T23:27:15.331131" elapsed="0.000209"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:15.331603" 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-28T23:27:15.331429" elapsed="0.000204"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:15.331920" 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-28T23:27:15.331723" elapsed="0.000227"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:15.328927" elapsed="0.003054"/>
</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-28T23:27:15.332090" 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-28T23:27:15.332201" 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-28T23:27:15.332299" 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-28T23:27:15.332398" 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-28T23:27:15.332495" 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-28T23:27:15.332593" 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-28T23:27:15.332713" 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-28T23:27:15.332829" 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-28T23:27:15.332928" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:15.332007" elapsed="0.000968"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:15.328317" elapsed="0.004683"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:15.333275" 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-28T23:27:15.333097" elapsed="0.000218"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:15.333653" 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-28T23:27:15.333402" elapsed="0.000415"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:15.327610" elapsed="0.006269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:15.334059" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:15.333982" elapsed="0.000113"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:15.325857" elapsed="0.008290"/>
</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-28T23:27:15.336429" 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-28T23:27:15.335836" elapsed="0.000620"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:15.337072" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:15.336577" elapsed="0.000551"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:15.336558" elapsed="0.000595"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:15.337185" elapsed="0.000036"/>
</return>
<msg time="2026-05-28T23:27:15.337512" 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-28T23:27:15.335172" elapsed="0.002378"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:15.337946" 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-28T23:27:15.337750" elapsed="0.000220"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:17.216375" 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-28T23:27:17.216602" 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 15: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': 'a02e485488118ace-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:17.216706" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:17.216909" 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-28T23:27:15.338506" elapsed="1.878622">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-28T23:27:17.217260" elapsed="0.000048"/>
</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-28T23:27:15.338116" elapsed="1.879342">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-28T23:27:17.217813" elapsed="0.000050"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T23:27:17.218021" elapsed="0.000023"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T23:27:17.218166" elapsed="0.000017"/>
</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-28T23:27:17.218325" elapsed="0.000021"/>
</kw>
<doc>验证Vajra District列表接口功能</doc>
<tag>app</tag>
<status status="FAIL" start="2026-05-28T23:27:15.334218" elapsed="1.884439">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-28T23:27:15.320541" elapsed="1.898813"/>
</suite>
<status status="FAIL" start="2026-05-28T23:27:07.869318" elapsed="9.351396"/>
</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-28T23:27:17.230519" 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-28T23:27:17.230262" elapsed="0.000304"/>
</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-28T23:27:17.230996" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:17.230706" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.231302" 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-28T23:27:17.231158" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:17.231078" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:17.230674" elapsed="0.000747"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.234024" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:17.233903" elapsed="0.000169"/>
</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-28T23:27:17.234304" elapsed="0.000015"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${ENV_NAME}</arg>
<arg>测试环境</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:17.234433" 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-28T23:27:17.234573" 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-28T23:27:17.234710" 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-28T23:27:17.234811" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:17.234143" elapsed="0.000787"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.235400" 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-28T23:27:17.235114" elapsed="0.000357"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.236017" 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-28T23:27:17.235713" elapsed="0.000354"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.236409" 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-28T23:27:17.236205" elapsed="0.000239"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.236748" 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-28T23:27:17.236548" elapsed="0.000234"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.237175" 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-28T23:27:17.236938" elapsed="0.000278"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.237565" 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-28T23:27:17.237342" elapsed="0.000261"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.237946" 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-28T23:27:17.237718" elapsed="0.000267"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.238465" 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-28T23:27:17.238135" elapsed="0.000402"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.239034" 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-28T23:27:17.238718" elapsed="0.000435"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:17.234956" elapsed="0.004300"/>
</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-28T23:27:17.239654" elapsed="0.000024"/>
</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-28T23:27:17.239799" 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-28T23:27:17.239908" 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-28T23:27:17.240065" 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-28T23:27:17.240185" elapsed="0.000024"/>
</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-28T23:27:17.240299" 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-28T23:27:17.240407" 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-28T23:27:17.240512" 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-28T23:27:17.240618" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:17.239391" elapsed="0.001272"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:17.234124" elapsed="0.006564"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.241020" 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-28T23:27:17.240788" elapsed="0.000284"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:17.241480" 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-28T23:27:17.241180" elapsed="0.000495"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:17.233493" elapsed="0.008258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.241933" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:17.241854" elapsed="0.000116"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:17.229877" elapsed="0.012144"/>
</kw>
<test id="s1-s2-s1-s1-t1" name="获取期货U本位交易对详情" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.243765" 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-28T23:27:17.243566" elapsed="0.000221"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.245315" 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-28T23:27:17.244713" elapsed="0.000685"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:17.246093" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:17.245543" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:17.245516" elapsed="0.000653"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:17.246203" elapsed="0.000039"/>
</return>
<msg time="2026-05-28T23:27:17.246401" 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-28T23:27:17.244016" elapsed="0.002406"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:17.747040" 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-28T23:27:17.747326" 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 15: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': 'a02e4857defee06a-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:17.747512" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:17.747814" 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-28T23:27:17.246942" elapsed="0.501292">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-28T23:27:17.748452" elapsed="0.000062"/>
</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-28T23:27:17.246572" elapsed="0.502166">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-28T23:27:17.749271" elapsed="0.000075"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T23:27:17.749661" elapsed="0.000052"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T23:27:17.750013" 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-28T23:27:17.750327" elapsed="0.000042"/>
</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-28T23:27:17.750597" elapsed="0.000036"/>
</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-28T23:27:17.750856" 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-28T23:27:17.751127" 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-28T23:27:17.751389" elapsed="0.000035"/>
</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-28T23:27:17.751758" elapsed="0.000048"/>
</kw>
<doc>验证期货U本位交易对详情接口功能</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:17.242099" elapsed="0.510050">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-28T23:27:17.757283" 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-28T23:27:17.755419" elapsed="0.002065"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.760843" 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-28T23:27:17.759707" elapsed="0.001183"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:17.762064" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:17.761116" elapsed="0.001064"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:17.761078" elapsed="0.001144"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:17.762283" elapsed="0.000057"/>
</return>
<msg time="2026-05-28T23:27:17.762668" 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-28T23:27:17.758113" elapsed="0.004598"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:17.879490" 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-28T23:27:17.879779" 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 15: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': 'a02e4858afa4e06a-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:17.879974" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:17.880248" 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-28T23:27:17.763537" elapsed="0.117081">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-28T23:27:17.880823" elapsed="0.000056"/>
</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-28T23:27:17.762986" elapsed="0.118109">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-28T23:27:17.881589" elapsed="0.000071"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T23:27:17.881961" elapsed="0.000053"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T23:27:17.882294" elapsed="0.000056"/>
</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-28T23:27:17.882606" elapsed="0.000040"/>
</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-28T23:27:17.882877" elapsed="0.000040"/>
</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-28T23:27:17.883143" elapsed="0.000039"/>
</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-28T23:27:17.883417" 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-28T23:27:17.883674" elapsed="0.000036"/>
</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-28T23:27:17.884061" elapsed="0.000048"/>
</kw>
<doc>验证期货U本位其他交易对详情接口功能</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:17.752388" elapsed="0.132104">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-28T23:27:17.226284" elapsed="0.658921"/>
</suite>
<status status="FAIL" start="2026-05-28T23:27:17.224852" elapsed="0.661523"/>
</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-28T23:27:17.897179" 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-28T23:27:17.896840" elapsed="0.000390"/>
</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-28T23:27:17.897593" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:17.897352" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.897966" 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-28T23:27:17.897811" elapsed="0.000208"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:17.897697" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:17.897325" elapsed="0.000762"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.898996" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:17.898832" elapsed="0.000226"/>
</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-28T23:27:17.899363" 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-28T23:27:17.899493" 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-28T23:27:17.899614" 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-28T23:27:17.899730" 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-28T23:27:17.899847" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:17.899153" elapsed="0.000745"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.900360" 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-28T23:27:17.900074" elapsed="0.000327"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.900746" 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-28T23:27:17.900512" elapsed="0.000273"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.901111" 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-28T23:27:17.900893" elapsed="0.000256"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.901597" 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-28T23:27:17.901256" elapsed="0.000402"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.902099" 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-28T23:27:17.901835" elapsed="0.000307"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.902506" 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-28T23:27:17.902269" elapsed="0.000303"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.903086" 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-28T23:27:17.902759" elapsed="0.000391"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.903558" 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-28T23:27:17.903294" elapsed="0.000300"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.903911" 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-28T23:27:17.903693" elapsed="0.000254"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:17.899924" elapsed="0.004057"/>
</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-28T23:27:17.904145" 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-28T23:27:17.904261" elapsed="0.000027"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<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-28T23:27:17.904383" 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-28T23:27:17.904500" 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-28T23:27:17.904600" 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-28T23:27:17.904869" elapsed="0.000050"/>
</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-28T23:27:17.905012" 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-28T23:27:17.905109" 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-28T23:27:17.905197" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:17.904023" elapsed="0.001214"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:17.899127" elapsed="0.006133"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.905728" 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-28T23:27:17.905359" elapsed="0.000424"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:17.906292" 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-28T23:27:17.905886" elapsed="0.000619"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:17.898468" elapsed="0.008135"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:17.906898" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:17.906749" elapsed="0.000202"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:17.896462" elapsed="0.010554"/>
</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-28T23:27:17.910234" 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-28T23:27:17.909446" elapsed="0.000821"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:17.910945" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:17.910403" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:17.910380" elapsed="0.000648"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:17.911060" elapsed="0.000032"/>
</return>
<msg time="2026-05-28T23:27:17.911261" 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-28T23:27:17.908465" elapsed="0.002821"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:18.384842" 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-28T23:27:18.385307" 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 15: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': 'a02e485bdac7e375-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:18.385534" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:18.385906" 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-28T23:27:17.911812" elapsed="0.474644">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-28T23:27:18.386718" elapsed="0.000073"/>
</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-28T23:27:17.911438" elapsed="0.475605">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-28T23:27:18.387798" elapsed="0.000124"/>
</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-28T23:27:18.388349" elapsed="0.000061"/>
</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-28T23:27:18.388673" 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-28T23:27:18.388949" elapsed="0.000038"/>
</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-28T23:27:18.389207" elapsed="0.000071"/>
</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-28T23:27:18.389489" elapsed="0.000035"/>
</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-28T23:27:18.389723" elapsed="0.000037"/>
</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-28T23:27:18.389958" 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-28T23:27:18.390197" elapsed="0.000035"/>
</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-28T23:27:18.390435" elapsed="0.000035"/>
</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-28T23:27:18.390661" elapsed="0.000034"/>
</kw>
<doc>验证期货U本位深度数据接口功能（BTC/USDT）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:17.907097" elapsed="0.484057">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-28T23:27:18.398540" 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-28T23:27:18.397194" elapsed="0.001419"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:18.399880" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:18.398915" elapsed="0.001056"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:18.398856" elapsed="0.001149"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:18.400053" elapsed="0.000046"/>
</return>
<msg time="2026-05-28T23:27:18.400337" 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-28T23:27:18.395596" elapsed="0.004777"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:18.512873" 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-28T23:27:18.513216" 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 15: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': 'a02e485c9ceee375-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:18.513388" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:18.513788" 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-28T23:27:18.401134" elapsed="0.113152">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-28T23:27:18.514505" elapsed="0.000064"/>
</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-28T23:27:18.400611" elapsed="0.114285">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-28T23:27:18.515500" elapsed="0.000089"/>
</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-28T23:27:18.515915" 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-28T23:27:18.516203" 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-28T23:27:18.516479" elapsed="0.000049"/>
</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-28T23:27:18.516746" 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-28T23:27:18.516987" elapsed="0.000034"/>
</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-28T23:27:18.517224" 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-28T23:27:18.517456" elapsed="0.000035"/>
</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-28T23:27:18.517695" 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-28T23:27:18.517938" 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-28T23:27:18.518168" elapsed="0.000047"/>
</kw>
<doc>验证期货U本位深度数据接口功能（ETH/USDT）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:18.391758" elapsed="0.126844">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-28T23:27:18.525772" 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-28T23:27:18.524530" elapsed="0.001302"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:18.526992" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:18.526101" elapsed="0.000986"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:18.526041" elapsed="0.001147"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:18.527266" elapsed="0.000073"/>
</return>
<msg time="2026-05-28T23:27:18.527668" 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-28T23:27:18.522871" elapsed="0.004833"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:18.684052" 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-28T23:27:18.684223" 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 15: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': 'a02e485d6ed5e375-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:18.684341" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:18.685118" 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-28T23:27:18.528704" elapsed="0.156686">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-28T23:27:18.685615" elapsed="0.000038"/>
</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-28T23:27:18.528032" elapsed="0.157773">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-28T23:27:18.686134" elapsed="0.000041"/>
</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-28T23:27:18.686332" elapsed="0.000024"/>
</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-28T23:27:18.686501" elapsed="0.000021"/>
</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-28T23:27:18.686645" elapsed="0.000021"/>
</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-28T23:27:18.686785" elapsed="0.000020"/>
</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-28T23:27:18.686919" elapsed="0.000021"/>
</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-28T23:27:18.687068" elapsed="0.000021"/>
</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-28T23:27:18.687213" elapsed="0.000020"/>
</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-28T23:27:18.687349" elapsed="0.000020"/>
</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-28T23:27:18.687484" elapsed="0.000020"/>
</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-28T23:27:18.687619" elapsed="0.000020"/>
</kw>
<doc>验证期货U本位深度数据接口功能（SOL/USDT）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:18.519147" elapsed="0.168785">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-28T23:27:18.693613" 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-28T23:27:18.692737" elapsed="0.000917"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:18.694448" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:18.693816" elapsed="0.000702"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:18.693790" elapsed="0.000758"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:18.694591" elapsed="0.000048"/>
</return>
<msg time="2026-05-28T23:27:18.694825" 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-28T23:27:18.691444" elapsed="0.003409"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:18.808758" 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-28T23:27:18.809038" 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 15: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': 'a02e485e798fe375-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:18.809198" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:18.809481" 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-28T23:27:18.695451" elapsed="0.114516">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-28T23:27:18.810186" elapsed="0.000056"/>
</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-28T23:27:18.695023" elapsed="0.115431">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-28T23:27:18.810948" elapsed="0.000067"/>
</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-28T23:27:18.811276" elapsed="0.000041"/>
</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-28T23:27:18.811536" 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-28T23:27:18.811812" 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-28T23:27:18.812062" 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-28T23:27:18.812560" elapsed="0.000069"/>
</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-28T23:27:18.812892" elapsed="0.000050"/>
</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-28T23:27:18.813166" elapsed="0.000038"/>
</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-28T23:27:18.813423" elapsed="0.000040"/>
</kw>
<doc>验证期货U本位深度数据接口不同深度级别功能</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:18.688341" elapsed="0.125514">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-28T23:27:18.820468" 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-28T23:27:18.819304" elapsed="0.001265"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:18.822145" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:18.820958" elapsed="0.001298"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:18.820897" elapsed="0.001398"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:18.822355" elapsed="0.000063"/>
</return>
<msg time="2026-05-28T23:27:18.822748" 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-28T23:27:18.818301" elapsed="0.004485"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:19.486170" 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-28T23:27:19.486343" 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 15: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': 'a02e485f4bb8e375-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:19.486465" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:19.486633" 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-28T23:27:18.823702" elapsed="0.663200">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-28T23:27:19.487024" elapsed="0.000066"/>
</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-28T23:27:18.823055" elapsed="0.664257">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-28T23:27:19.487672" elapsed="0.000032"/>
</kw>
<doc>验证期货U本位深度数据接口错误处理（无效交易对）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:18.814378" elapsed="0.673535">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-28T23:27:19.494607" 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-28T23:27:19.493807" elapsed="0.000849"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:19.495483" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:19.494866" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:19.494827" elapsed="0.000745"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:19.495619" elapsed="0.000046"/>
</return>
<msg time="2026-05-28T23:27:19.495896" 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-28T23:27:19.491552" elapsed="0.004369"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:19.608395" 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-28T23:27:19.608668" 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 15: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': 'a02e48637f9ee375-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:19.608831" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:19.609120" 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-28T23:27:19.496619" elapsed="0.112923">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-28T23:27:19.609752" elapsed="0.000060"/>
</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-28T23:27:19.496153" elapsed="0.113877">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-28T23:27:19.610297" elapsed="0.000025"/>
</kw>
<doc>验证期货U本位深度数据接口参数验证（缺少symbol参数）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:19.488163" elapsed="0.122345">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-28T23:27:17.890603" elapsed="1.720241"/>
</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-28T23:27:19.618771" 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-28T23:27:19.618565" 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-28T23:27:19.619193" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:19.618959" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:19.619656" 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-28T23:27:19.619365" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:19.619276" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:19.618933" elapsed="0.000845"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:19.620906" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:19.620549" elapsed="0.000440"/>
</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-28T23:27:19.621385" elapsed="0.000029"/>
</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-28T23:27:19.621566" elapsed="0.000045"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<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-28T23:27:19.621792" elapsed="0.000049"/>
</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-28T23:27:19.622074" elapsed="0.000066"/>
</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-28T23:27:19.622328" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:19.621113" elapsed="0.001273"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:19.623036" 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-28T23:27:19.622675" elapsed="0.000404"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:19.623345" 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-28T23:27:19.623169" elapsed="0.000207"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:19.623700" 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-28T23:27:19.623462" elapsed="0.000283"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:19.624151" 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-28T23:27:19.623881" elapsed="0.000315"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:19.624603" 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-28T23:27:19.624331" elapsed="0.000317"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:19.625034" 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-28T23:27:19.624775" elapsed="0.000304"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:19.625493" 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-28T23:27:19.625213" elapsed="0.000324"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:19.625955" 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-28T23:27:19.625673" elapsed="0.000328"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:19.626290" 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-28T23:27:19.626113" elapsed="0.000204"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:19.622422" elapsed="0.003924"/>
</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-28T23:27:19.626456" 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-28T23:27:19.626568" 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-28T23:27:19.626659" 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-28T23:27:19.626753" 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-28T23:27:19.626849" 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-28T23:27:19.626939" 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-28T23:27:19.627035" 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-28T23:27:19.627136" 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-28T23:27:19.627315" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:19.626376" elapsed="0.000978"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:19.621077" elapsed="0.006296"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:19.627667" 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-28T23:27:19.627464" elapsed="0.000251"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:19.628129" 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-28T23:27:19.627802" elapsed="0.000606"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:19.620108" elapsed="0.008387"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:19.628708" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:19.628611" elapsed="0.000131"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:19.618263" elapsed="0.010528"/>
</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-28T23:27:19.632383" 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-28T23:27:19.631610" elapsed="0.000822"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:19.633526" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:19.632789" elapsed="0.000821"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:19.632691" elapsed="0.000948"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:19.633684" elapsed="0.000047"/>
</return>
<msg time="2026-05-28T23:27:19.634092" 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-28T23:27:19.630578" elapsed="0.003541"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:20.099088" 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-28T23:27:20.099444" 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 15: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': 'a02e48668e7aae17-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:20.099624" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:20.099947" 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-28T23:27:19.634895" elapsed="0.465566">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-28T23:27:20.100810" elapsed="0.000085"/>
</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-28T23:27:19.634377" elapsed="0.466898">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-28T23:27:20.102141" elapsed="0.000145"/>
</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-28T23:27:20.102625" elapsed="0.000038"/>
</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-28T23:27:20.102850" elapsed="0.000028"/>
</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-28T23:27:20.103139" elapsed="0.000031"/>
</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-28T23:27:20.103321" elapsed="0.000026"/>
</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-28T23:27:20.103502" elapsed="0.000027"/>
</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-28T23:27:20.103680" elapsed="0.000025"/>
</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-28T23:27:20.103881" elapsed="0.000029"/>
</kw>
<doc>验证期货U本位资金费率接口功能（BTC/USDT）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:19.628897" elapsed="0.475405">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-28T23:27:20.109442" 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-28T23:27:20.108392" elapsed="0.001105"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:20.110468" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:20.109718" elapsed="0.000821"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:20.109681" elapsed="0.000890"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:20.110615" elapsed="0.000053"/>
</return>
<msg time="2026-05-28T23:27:20.110917" 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-28T23:27:20.107194" elapsed="0.003749"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:20.257103" 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-28T23:27:20.257529" 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 15: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': 'a02e48674858ae17-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:20.257715" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:20.258100" 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-28T23:27:20.111855" elapsed="0.146762">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-28T23:27:20.258909" 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-28T23:27:20.111194" elapsed="0.148037">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-28T23:27:20.259953" elapsed="0.000098"/>
</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-28T23:27:20.260339" elapsed="0.000025"/>
</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-28T23:27:20.260465" elapsed="0.000016"/>
</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-28T23:27:20.260571" elapsed="0.000015"/>
</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-28T23:27:20.260670" elapsed="0.000017"/>
</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-28T23:27:20.260859" elapsed="0.000014"/>
</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-28T23:27:20.260954" elapsed="0.000014"/>
</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-28T23:27:20.261051" elapsed="0.000015"/>
</kw>
<doc>验证期货U本位资金费率接口功能（ETH/USDT）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:20.104898" elapsed="0.156421">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-28T23:27:20.265415" 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-28T23:27:20.264548" elapsed="0.000936"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:20.266927" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:20.265802" elapsed="0.001222"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:20.265751" elapsed="0.001312"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:20.267118" elapsed="0.000047"/>
</return>
<msg time="2026-05-28T23:27:20.267430" 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-28T23:27:20.263628" elapsed="0.003844"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:20.377399" 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-28T23:27:20.377604" 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 15: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': 'a02e48684b4fae17-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:20.377740" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:20.378083" 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-28T23:27:20.268429" elapsed="0.110134">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-28T23:27:20.378805" elapsed="0.000073"/>
</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-28T23:27:20.267731" elapsed="0.111388">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-28T23:27:20.379707" 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-28T23:27:20.380067" elapsed="0.000041"/>
</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-28T23:27:20.380338" 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-28T23:27:20.380587" elapsed="0.000036"/>
</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-28T23:27:20.380825" elapsed="0.000035"/>
</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-28T23:27:20.381012" elapsed="0.000015"/>
</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-28T23:27:20.381173" elapsed="0.000015"/>
</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-28T23:27:20.381270" elapsed="0.000013"/>
</kw>
<doc>验证期货U本位资金费率接口功能（SOL/USDT）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:20.261595" elapsed="0.119920">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-28T23:27:20.386875" 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-28T23:27:20.385776" elapsed="0.001184"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:20.388439" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:20.387308" elapsed="0.001252"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:20.387240" elapsed="0.001368"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:20.388678" elapsed="0.000075"/>
</return>
<msg time="2026-05-28T23:27:20.389081" 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-28T23:27:20.383939" elapsed="0.005187"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:20.499647" 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-28T23:27:20.499813" 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 15: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': 'a02e48690d77ae17-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:20.499896" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:20.500100" 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-28T23:27:20.389912" elapsed="0.110456">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-28T23:27:20.500496" elapsed="0.000038"/>
</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-28T23:27:20.389422" elapsed="0.111274">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-28T23:27:20.501190" elapsed="0.000062"/>
</kw>
<doc>验证期货U本位资金费率接口错误处理（无效交易对）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:20.381776" elapsed="0.119920">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-28T23:27:20.506733" 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-28T23:27:20.505630" elapsed="0.001208"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:20.508496" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:20.507379" elapsed="0.001217"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:20.507328" elapsed="0.001298"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:20.508672" elapsed="0.000055"/>
</return>
<msg time="2026-05-28T23:27:20.509001" 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-28T23:27:20.504198" elapsed="0.004828"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:20.620093" 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-28T23:27:20.620256" 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 15: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': 'a02e4869cf6dae17-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:20.620360" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:20.620523" 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-28T23:27:20.510505" elapsed="0.110429">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-28T23:27:20.621110" elapsed="0.000048"/>
</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-28T23:27:20.509291" elapsed="0.112028">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-28T23:27:20.621577" elapsed="0.000031"/>
</kw>
<doc>验证期货U本位资金费率接口参数验证（缺少symbol参数）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:20.502065" elapsed="0.119774">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-28T23:27:19.611834" elapsed="1.012706"/>
</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-28T23:27:20.631248" 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-28T23:27:20.630924" elapsed="0.000365"/>
</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-28T23:27:20.631707" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:20.631430" elapsed="0.000340"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:20.632093" 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-28T23:27:20.631887" elapsed="0.000264"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:20.631800" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:20.631394" elapsed="0.000807"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:20.633302" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:20.633153" elapsed="0.000193"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:20.633590" 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-28T23:27:20.633683" 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-28T23:27:20.633765" elapsed="0.000011"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:20.633841" elapsed="0.000012"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${APP_PREFIX}</arg>
<arg>Test</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:20.633916" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:20.633412" elapsed="0.000538"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:20.634351" 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-28T23:27:20.634173" elapsed="0.000221"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:20.634777" 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-28T23:27:20.634532" elapsed="0.000298"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:20.635434" 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-28T23:27:20.634966" elapsed="0.000513"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:20.635854" 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-28T23:27:20.635609" elapsed="0.000290"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:20.636273" 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-28T23:27:20.636026" elapsed="0.000293"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:20.636583" 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-28T23:27:20.636441" elapsed="0.000168"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:20.636827" 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-28T23:27:20.636682" elapsed="0.000171"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:20.637069" 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-28T23:27:20.636924" elapsed="0.000178"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:20.637319" 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-28T23:27:20.637173" elapsed="0.000189"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:20.634039" elapsed="0.003362"/>
</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-28T23:27:20.637546" elapsed="0.000023"/>
</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-28T23:27:20.637684" 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-28T23:27:20.637814" 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-28T23:27:20.637938" 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-28T23:27:20.638064" 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-28T23:27:20.638186" 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-28T23:27:20.638316" 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-28T23:27:20.638438" elapsed="0.000018"/>
</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-28T23:27:20.638559" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:20.637429" elapsed="0.001182"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:20.633395" elapsed="0.005240"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:20.638951" 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-28T23:27:20.638740" elapsed="0.000263"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:20.639471" 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-28T23:27:20.639127" elapsed="0.000549"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:20.632749" elapsed="0.007010"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:20.639990" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:20.639885" elapsed="0.000153"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:20.630416" elapsed="0.009680"/>
</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-28T23:27:20.642841" 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-28T23:27:20.642190" 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-28T23:27:20.643534" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:20.643029" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:20.643009" elapsed="0.000616"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:20.643658" elapsed="0.000034"/>
</return>
<msg time="2026-05-28T23:27:20.643857" 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-28T23:27:20.641498" elapsed="0.002385"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:21.101411" 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-28T23:27:21.101659" 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 15: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': 'a02e486cc818d76f-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:21.101812" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:21.102052" 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-28T23:27:20.644690" elapsed="0.457676">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-28T23:27:21.102525" elapsed="0.000052"/>
</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-28T23:27:20.644024" elapsed="0.458733">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-28T23:27:21.103390" elapsed="0.000085"/>
</kw>
<kw name="验证指数价格数据不为空">
<arg>${response.json()}</arg>
<status status="NOT RUN" start="2026-05-28T23:27:21.103669" elapsed="0.000021"/>
</kw>
<kw name="验证指数价格列表格式">
<arg>${response.json()['data']}</arg>
<status status="NOT RUN" start="2026-05-28T23:27:21.103913" elapsed="0.000023"/>
</kw>
<doc>测试获取所有期货U本位指数价格</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:20.640175" elapsed="0.464059">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-28T23:27:21.107191" 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-28T23:27:21.106742" elapsed="0.000490"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:21.109737" 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-28T23:27:21.108852" elapsed="0.000932"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:21.110716" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:21.110025" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:21.109986" elapsed="0.000817"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:21.110844" elapsed="0.000051"/>
</return>
<msg time="2026-05-28T23:27:21.111075" 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-28T23:27:21.107671" elapsed="0.003425"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:21.305578" 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-28T23:27:21.305943" 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 15: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': 'a02e486d9a26d76f-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:21.306113" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:21.306343" 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-28T23:27:21.112556" elapsed="0.194119">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-28T23:27:21.306841" elapsed="0.000053"/>
</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-28T23:27:21.111342" elapsed="0.195789">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-28T23:27:21.307686" elapsed="0.000047"/>
</kw>
<kw name="验证指数价格数据不为空">
<arg>${response.json()}</arg>
<status status="NOT RUN" start="2026-05-28T23:27:21.307878" elapsed="0.000022"/>
</kw>
<kw name="验证指数价格列表格式">
<arg>${response.json()['data']}</arg>
<status status="NOT RUN" start="2026-05-28T23:27:21.308037" elapsed="0.000027"/>
</kw>
<kw name="验证单个指数价格符号">
<arg>${response.json()['data']}</arg>
<arg>btc_usdt</arg>
<status status="NOT RUN" start="2026-05-28T23:27:21.308171" elapsed="0.000025"/>
</kw>
<doc>测试获取单个期货U本位指数价格</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:21.104862" elapsed="0.203526">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-28T23:27:21.310955" 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-28T23:27:21.310621" elapsed="0.000362"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:21.314001" 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-28T23:27:21.312829" elapsed="0.001212"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:21.314770" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:21.314236" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:21.314197" elapsed="0.000666"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:21.314922" elapsed="0.000038"/>
</return>
<msg time="2026-05-28T23:27:21.315112" 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-28T23:27:21.311218" elapsed="0.003917"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:21.426684" 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-28T23:27:21.426919" 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 15: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': 'a02e486edd60d76f-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:21.427125" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:21.427344" 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-28T23:27:21.315648" elapsed="0.111975">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-28T23:27:21.427792" elapsed="0.000052"/>
</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-28T23:27:21.315270" elapsed="0.112733">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-28T23:27:21.428428" 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-28T23:27:21.428655" elapsed="0.000020"/>
</kw>
<kw name="验证符号指数价格数据结构">
<arg>${data}</arg>
<status status="NOT RUN" start="2026-05-28T23:27:21.428851" elapsed="0.000021"/>
</kw>
<kw name="验证符号指数价格符号">
<arg>${data['s']}</arg>
<arg>btc_usdt</arg>
<status status="NOT RUN" start="2026-05-28T23:27:21.428973" elapsed="0.000017"/>
</kw>
<kw name="验证符号指数价格价格格式">
<arg>${data['p']}</arg>
<status status="NOT RUN" start="2026-05-28T23:27:21.429091" elapsed="0.000018"/>
</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-28T23:27:21.429250" elapsed="0.000018"/>
</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-28T23:27:21.429360" elapsed="0.000022"/>
</kw>
<doc>测试获取BTC期货U本位符号指数价格</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:21.308666" elapsed="0.120993">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-28T23:27:21.432291" 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-28T23:27:21.431691" elapsed="0.000762"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:21.437805" 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-28T23:27:21.436897" elapsed="0.000971"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:21.439077" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:21.438098" elapsed="0.001127"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:21.438061" elapsed="0.001214"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:21.439354" elapsed="0.000078"/>
</return>
<msg time="2026-05-28T23:27:21.439886" 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-28T23:27:21.432864" elapsed="0.007093"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:21.552695" 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-28T23:27:21.552870" 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 15: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': 'a02e486faf67d76f-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:21.553019" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:21.553162" 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-28T23:27:21.441463" elapsed="0.111924">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-28T23:27:21.553536" 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-28T23:27:21.440569" elapsed="0.113363">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-28T23:27:21.554577" elapsed="0.000087"/>
</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-28T23:27:21.555148" elapsed="0.000107"/>
</kw>
<kw name="验证符号指数价格数据结构">
<arg>${data}</arg>
<status status="NOT RUN" start="2026-05-28T23:27:21.555757" elapsed="0.000103"/>
</kw>
<kw name="验证符号指数价格符号">
<arg>${data['s']}</arg>
<arg>eth_usdt</arg>
<status status="NOT RUN" start="2026-05-28T23:27:21.556128" elapsed="0.000020"/>
</kw>
<kw name="验证符号指数价格价格格式">
<arg>${data['p']}</arg>
<status status="NOT RUN" start="2026-05-28T23:27:21.556248" elapsed="0.000017"/>
</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-28T23:27:21.556374" elapsed="0.000015"/>
</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-28T23:27:21.556483" elapsed="0.000013"/>
</kw>
<doc>测试获取ETH期货U本位符号指数价格</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:21.429999" elapsed="0.126765">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-28T23:27:21.560620" 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-28T23:27:21.560269" elapsed="0.000381"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:21.562244" 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-28T23:27:21.561614" elapsed="0.000663"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:21.563034" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:21.562438" elapsed="0.000656"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:21.562402" elapsed="0.000720"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:21.563165" elapsed="0.000046"/>
</return>
<msg time="2026-05-28T23:27:21.563400" 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-28T23:27:21.560858" elapsed="0.002565"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:21.674458" 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-28T23:27:21.674743" 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 15: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': 'a02e4870695dd76f-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:21.675014" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:21.675270" 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-28T23:27:21.564084" elapsed="0.111520">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-28T23:27:21.675806" 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-28T23:27:21.563605" elapsed="0.112468">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-28T23:27:21.676590" elapsed="0.000072"/>
</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-28T23:27:21.676892" elapsed="0.000025"/>
</kw>
<kw name="验证符号指数价格数据结构">
<arg>${data}</arg>
<status status="NOT RUN" start="2026-05-28T23:27:21.677085" elapsed="0.000024"/>
</kw>
<kw name="验证符号指数价格符号">
<arg>${data['s']}</arg>
<arg>sol_usdt</arg>
<status status="NOT RUN" start="2026-05-28T23:27:21.677219" elapsed="0.000018"/>
</kw>
<kw name="验证符号指数价格价格格式">
<arg>${data['p']}</arg>
<status status="NOT RUN" start="2026-05-28T23:27:21.677340" elapsed="0.000018"/>
</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-28T23:27:21.677458" elapsed="0.000016"/>
</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-28T23:27:21.677561" elapsed="0.000016"/>
</kw>
<doc>测试获取SOL期货U本位符号指数价格</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:21.557104" elapsed="0.120688">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-28T23:27:21.681643" 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-28T23:27:21.681396" elapsed="0.000273"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:21.684355" 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-28T23:27:21.683270" elapsed="0.001131"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:21.685364" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:21.684619" elapsed="0.000805"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:21.684582" elapsed="0.000867"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:21.685487" elapsed="0.000037"/>
</return>
<msg time="2026-05-28T23:27:21.685719" 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-28T23:27:21.681877" elapsed="0.003867"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:21.829418" 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-28T23:27:21.830014" 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 15: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': 'a02e48712b69d76f-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:21.830314" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:21.830535" 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-28T23:27:21.686269" elapsed="0.144579">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-28T23:27:21.831025" elapsed="0.000055"/>
</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-28T23:27:21.685892" elapsed="0.145360">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-28T23:27:21.831584" elapsed="0.000041"/>
</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-28T23:27:21.831836" elapsed="0.000038"/>
</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-28T23:27:21.832021" elapsed="0.000020"/>
</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-28T23:27:21.832165" elapsed="0.000021"/>
</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-28T23:27:21.832537" elapsed="0.000027"/>
</kw>
<doc>测试获取无效交易对的符号指数价格</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:21.678066" elapsed="0.154861">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-28T23:27:21.837692" 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-28T23:27:21.836950" elapsed="0.000787"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:21.838541" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:21.837918" elapsed="0.000693"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:21.837881" elapsed="0.000759"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:21.838686" elapsed="0.000060"/>
</return>
<msg time="2026-05-28T23:27:21.839117" 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-28T23:27:21.835929" elapsed="0.003235"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:21.952182" 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-28T23:27:21.952367" 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 15: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': 'a02e48721dfbd76f-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:21.952456" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:21.952684" 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-28T23:27:21.841035" elapsed="0.111874">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-28T23:27:21.953083" elapsed="0.000059"/>
</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-28T23:27:21.839792" elapsed="0.113560">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-28T23:27:21.953733" elapsed="0.000049"/>
</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-28T23:27:21.954018" elapsed="0.000038"/>
</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-28T23:27:21.954261" 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-28T23:27:21.954522" elapsed="0.000045"/>
</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-28T23:27:21.954802" elapsed="0.000038"/>
</kw>
<doc>测试缺少symbol参数的符号指数价格请求</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:21.833399" elapsed="0.121923">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-28T23:27:20.625952" elapsed="1.330149"/>
</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-28T23:27:21.964502" 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-28T23:27:21.964230" elapsed="0.000315"/>
</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-28T23:27:21.964953" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:21.964677" elapsed="0.000331"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:21.965361" 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-28T23:27:21.965111" elapsed="0.000303"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:21.965033" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:21.964647" elapsed="0.000815"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:21.966363" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:21.966233" 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-28T23:27:21.966646" 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-28T23:27:21.966751" 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-28T23:27:21.966848" 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-28T23:27:21.966940" 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-28T23:27:21.967037" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:21.966469" elapsed="0.000611"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:21.967632" 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-28T23:27:21.967266" elapsed="0.000427"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:21.967993" 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-28T23:27:21.967806" elapsed="0.000227"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:21.968307" 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-28T23:27:21.968134" elapsed="0.000203"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:21.968609" 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-28T23:27:21.968430" elapsed="0.000212"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:21.968953" 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-28T23:27:21.968741" elapsed="0.000244"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:21.969421" 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-28T23:27:21.969224" elapsed="0.000227"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:21.969732" 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-28T23:27:21.969539" elapsed="0.000222"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:21.970043" 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-28T23:27:21.969852" elapsed="0.000224"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:21.970379" 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-28T23:27:21.970176" elapsed="0.000233"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:21.967106" elapsed="0.003348"/>
</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-28T23:27:21.970589" 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-28T23:27:21.970696" 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-28T23:27:21.970800" 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-28T23:27:21.970898" 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-28T23:27:21.970994" 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-28T23:27:21.971090" 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-28T23:27:21.971191" 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-28T23:27:21.971291" 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-28T23:27:21.971393" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:21.970495" elapsed="0.000943"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:21.966452" elapsed="0.005019"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:21.972093" 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-28T23:27:21.971603" elapsed="0.000597"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:21.972983" 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-28T23:27:21.972421" elapsed="0.000877"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:21.965929" elapsed="0.007481"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:21.973685" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:21.973566" elapsed="0.000154"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:21.963770" elapsed="0.010002"/>
</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-28T23:27:21.977249" 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-28T23:27:21.976563" elapsed="0.000732"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:21.977985" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:21.977444" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:21.977415" elapsed="0.000811"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:21.978285" elapsed="0.000056"/>
</return>
<msg time="2026-05-28T23:27:21.978615" 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-28T23:27:21.975590" elapsed="0.003062"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:22.986319" 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-28T23:27:22.986809" 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 15:27:22 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': 'a02e48789e3df277-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:22.987058" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:22.987483" 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-28T23:27:21.980032" elapsed="1.008018">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-28T23:27:22.988349" elapsed="0.000095"/>
</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-28T23:27:21.978880" elapsed="1.009889">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-28T23:27:22.989489" elapsed="0.000082"/>
</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-28T23:27:22.989819" elapsed="0.000023"/>
</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-28T23:27:22.989938" elapsed="0.000015"/>
</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-28T23:27:22.990043" elapsed="0.000014"/>
</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-28T23:27:22.990155" elapsed="0.000020"/>
</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-28T23:27:22.990375" elapsed="0.000035"/>
</kw>
<kw name="验证期货标记价格列表结构">
<arg>${data}</arg>
<doc>验证期货标记价格列表的数据结构</doc>
<status status="NOT RUN" start="2026-05-28T23:27:22.990849" elapsed="0.000048"/>
</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-28T23:27:22.991210" elapsed="0.000038"/>
</kw>
<doc>验证期货U本位标记价格接口功能</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:21.973888" elapsed="1.017674">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-28T23:27:21.957887" elapsed="1.034268"/>
</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-28T23:27:22.999686" 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-28T23:27:22.999439" elapsed="0.000277"/>
</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-28T23:27:22.999999" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:22.999806" elapsed="0.000236"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:23.000259" 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-28T23:27:23.000138" elapsed="0.000158"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:23.000064" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:22.999783" elapsed="0.000557"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:23.001557" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:23.001404" elapsed="0.000210"/>
</kw>
<if>
<branch type="IF" condition="'${env}' == 'test'">
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${BASE_URL}</arg>
<arg>https://api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:23.001876" 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-28T23:27:23.001978" 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-28T23:27:23.002071" 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-28T23:27:23.002165" 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-28T23:27:23.002256" elapsed="0.000083"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:23.001697" elapsed="0.000671"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:23.002840" 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-28T23:27:23.002527" elapsed="0.000399"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:23.003456" 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-28T23:27:23.003130" elapsed="0.000377"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:23.003896" 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-28T23:27:23.003653" elapsed="0.000281"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:23.004264" 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-28T23:27:23.004047" elapsed="0.000256"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:23.004640" 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-28T23:27:23.004420" elapsed="0.000259"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:23.005016" 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-28T23:27:23.004792" elapsed="0.000261"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:23.005394" 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-28T23:27:23.005162" elapsed="0.000269"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:23.005768" 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-28T23:27:23.005540" elapsed="0.000266"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:23.006105" 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-28T23:27:23.005914" elapsed="0.000220"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:23.002391" elapsed="0.003773"/>
</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-28T23:27:23.006283" 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-28T23:27:23.006383" 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-28T23:27:23.006473" 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-28T23:27:23.006563" 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-28T23:27:23.006654" 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-28T23:27:23.006744" 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-28T23:27:23.006833" 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-28T23:27:23.006924" 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-28T23:27:23.007012" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:23.006196" elapsed="0.000855"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:23.001675" elapsed="0.005393"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:23.007351" 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-28T23:27:23.007173" elapsed="0.000225"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:23.007790" 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-28T23:27:23.007494" elapsed="0.000489"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:23.001033" elapsed="0.007023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:23.008234" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:23.008157" elapsed="0.000114"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:22.999046" elapsed="0.009272"/>
</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-28T23:27:23.011513" 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-28T23:27:23.011030" elapsed="0.000508"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:23.012121" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:23.011704" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:23.011686" elapsed="0.000499"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:23.012210" elapsed="0.000028"/>
</return>
<msg time="2026-05-28T23:27:23.012363" 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-28T23:27:23.010392" elapsed="0.001990"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:23.417847" 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-28T23:27:23.418014" 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 15: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': 'a02e487b4c1674b1-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:23.418097" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:23.418364" 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-28T23:27:23.012987" elapsed="0.405711">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-28T23:27:23.418854" elapsed="0.000047"/>
</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-28T23:27:23.012495" elapsed="0.406591">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-28T23:27:23.419438" elapsed="0.000047"/>
</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-28T23:27:23.419700" 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-28T23:27:23.419910" elapsed="0.000033"/>
</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-28T23:27:23.420083" elapsed="0.000037"/>
</kw>
<kw name="验证期货符号标记价格结构">
<arg>${response_data}</arg>
<arg>btc_usdt</arg>
<doc>验证期货单个交易对标记价格的数据结构</doc>
<status status="NOT RUN" start="2026-05-28T23:27:23.420358" elapsed="0.000029"/>
</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-28T23:27:23.420539" elapsed="0.000018"/>
</kw>
<doc>验证期货U本位单个交易对标记价格接口功能</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:23.008403" elapsed="0.412409">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-28T23:27:23.426420" 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-28T23:27:23.425663" elapsed="0.000797"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:23.427233" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:23.426696" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:23.426665" elapsed="0.000666"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:23.427393" elapsed="0.000057"/>
</return>
<msg time="2026-05-28T23:27:23.427676" 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-28T23:27:23.424475" elapsed="0.003227"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:23.544099" 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-28T23:27:23.544252" 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 15: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': 'a02e487c1e7974b1-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:23.544356" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:23.544531" 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-28T23:27:23.428739" elapsed="0.116069">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-28T23:27:23.545028" elapsed="0.000059"/>
</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-28T23:27:23.427904" elapsed="0.117399">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-28T23:27:23.545814" elapsed="0.000070"/>
</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-28T23:27:23.546166" 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-28T23:27:23.546438" 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-28T23:27:23.546727" elapsed="0.000042"/>
</kw>
<kw name="验证期货符号标记价格结构">
<arg>${response_data}</arg>
<arg>eth_usdt</arg>
<doc>验证期货单个交易对标记价格的数据结构</doc>
<status status="NOT RUN" start="2026-05-28T23:27:23.547142" 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-28T23:27:23.547601" elapsed="0.000046"/>
</kw>
<doc>验证期货U本位ETH交易对标记价格接口功能</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:23.421375" elapsed="0.126478">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-28T23:27:23.554341" 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-28T23:27:23.553240" elapsed="0.001177"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:23.556106" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:23.554737" elapsed="0.001478"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:23.554678" elapsed="0.001576"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:23.556392" elapsed="0.000059"/>
</return>
<msg time="2026-05-28T23:27:23.556730" 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-28T23:27:23.551950" elapsed="0.004807"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:23.672762" 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-28T23:27:23.672979" 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 15: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': 'a02e487cd92a74b1-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:23.673099" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:23.673296" 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-28T23:27:23.557854" elapsed="0.115737">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-28T23:27:23.673800" elapsed="0.000058"/>
</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-28T23:27:23.557046" elapsed="0.117024">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-28T23:27:23.674467" elapsed="0.000052"/>
</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-28T23:27:23.674746" elapsed="0.000016"/>
</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-28T23:27:23.674854" elapsed="0.000014"/>
</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-28T23:27:23.674952" elapsed="0.000014"/>
</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-28T23:27:23.675047" elapsed="0.000014"/>
</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-28T23:27:23.675147" elapsed="0.000013"/>
</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-28T23:27:23.675248" elapsed="0.000015"/>
</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-28T23:27:23.675491" elapsed="0.000026"/>
</kw>
<doc>验证期货U本位标记价格接口对无效交易对的处理</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:23.548094" elapsed="0.127625">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-28T23:27:23.681736" 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-28T23:27:23.680671" elapsed="0.001098"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:23.682865" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:23.681903" elapsed="0.001072"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:23.681881" elapsed="0.001189"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:23.683133" elapsed="0.000052"/>
</return>
<msg time="2026-05-28T23:27:23.683488" 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-28T23:27:23.678935" elapsed="0.004597"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:23.798493" 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-28T23:27:23.798806" 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 15: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': 'a02e487daba774b1-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:23.799037" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:23.799397" 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-28T23:27:23.684648" elapsed="0.115137">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-28T23:27:23.799986" elapsed="0.000056"/>
</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-28T23:27:23.683787" elapsed="0.116461">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-28T23:27:23.800612" elapsed="0.000048"/>
</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-28T23:27:23.800894" elapsed="0.000067"/>
</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-28T23:27:23.801066" elapsed="0.000015"/>
</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-28T23:27:23.801166" elapsed="0.000014"/>
</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-28T23:27:23.801261" elapsed="0.000013"/>
</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-28T23:27:23.801358" elapsed="0.000013"/>
</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-28T23:27:23.801468" elapsed="0.000013"/>
</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-28T23:27:23.801717" elapsed="0.000034"/>
</kw>
<doc>验证期货U本位标记价格接口对缺少参数的处理</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:23.676230" elapsed="0.125737">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-28T23:27:23.809172" 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-28T23:27:23.807649" elapsed="0.001576"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:23.809876" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:23.809363" elapsed="0.000566"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:23.809338" elapsed="0.000615"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:23.810046" elapsed="0.000056"/>
</return>
<msg time="2026-05-28T23:27:23.810275" 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-28T23:27:23.806230" elapsed="0.004068"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:24.191459" 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-28T23:27:24.191797" 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 15: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': 'a02e487e7df874b1-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:24.191923" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:24.192187" 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-28T23:27:23.811081" elapsed="0.381422">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-28T23:27:24.192653" elapsed="0.000058"/>
</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-28T23:27:23.810457" elapsed="0.382399">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-28T23:27:24.193150" 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-28T23:27:24.193463" elapsed="0.000033"/>
</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-28T23:27:24.193594" elapsed="0.000016"/>
</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-28T23:27:24.193708" elapsed="0.000019"/>
</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-28T23:27:24.193814" elapsed="0.000016"/>
</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-28T23:27:24.193920" elapsed="0.000015"/>
</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-28T23:27:24.194034" elapsed="0.000015"/>
</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-28T23:27:24.194349" elapsed="0.000036"/>
</kw>
<doc>验证期货U本位标记价格接口对大写交易对的处理（应返回错误）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:23.802198" elapsed="0.392507">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-28T23:27:22.993646" elapsed="1.202193"/>
</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-28T23:27:24.203826" 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-28T23:27:24.203540" elapsed="0.000335"/>
</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-28T23:27:24.204244" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:24.204005" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:24.204576" 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-28T23:27:24.204418" elapsed="0.000210"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:24.204331" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:24.203974" elapsed="0.000704"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:24.205501" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:24.205270" elapsed="0.000276"/>
</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-28T23:27:24.205783" 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-28T23:27:24.205890" 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-28T23:27:24.205989" 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-28T23:27:24.206084" 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-28T23:27:24.206183" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:24.205614" elapsed="0.000616"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:24.206793" 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-28T23:27:24.206446" elapsed="0.000384"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:24.207123" 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-28T23:27:24.206923" elapsed="0.000232"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:24.207436" 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-28T23:27:24.207254" elapsed="0.000212"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:24.207755" 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-28T23:27:24.207564" elapsed="0.000220"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:24.208048" 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-28T23:27:24.207872" elapsed="0.000205"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:24.208345" 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-28T23:27:24.208167" elapsed="0.000209"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:24.208649" 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-28T23:27:24.208462" elapsed="0.000216"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:24.208946" 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-28T23:27:24.208763" elapsed="0.000212"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:24.209242" 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-28T23:27:24.209060" elapsed="0.000211"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:24.206255" elapsed="0.003045"/>
</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-28T23:27:24.209411" 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-28T23:27:24.209541" 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-28T23:27:24.209639" 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-28T23:27:24.209737" 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-28T23:27:24.209833" 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-28T23:27:24.209938" 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-28T23:27:24.210048" 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-28T23:27:24.210159" 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-28T23:27:24.210282" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:24.209323" elapsed="0.001003"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:24.205595" elapsed="0.004825"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:24.210773" 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-28T23:27:24.210540" elapsed="0.000295"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:24.211262" 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-28T23:27:24.210936" elapsed="0.000558"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:24.204979" elapsed="0.006673"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:24.211883" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:24.211775" elapsed="0.000152"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:24.203118" elapsed="0.008868"/>
</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-28T23:27:24.215552" 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-28T23:27:24.214699" elapsed="0.000882"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:24.216255" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:24.215716" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:24.215694" elapsed="0.000639"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:24.216369" elapsed="0.000039"/>
</return>
<msg time="2026-05-28T23:27:24.216570" 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-28T23:27:24.213875" elapsed="0.002720"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:25.910117" 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-28T23:27:25.910336" 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 15: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': 'a02e488add055f16-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:25.910498" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:25.910750" 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-28T23:27:24.217110" elapsed="1.693954">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-28T23:27:25.911308" elapsed="0.000074"/>
</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-28T23:27:24.216747" elapsed="1.694891">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-28T23:27:25.912267" 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-28T23:27:25.912662" elapsed="0.000042"/>
</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-28T23:27:25.912927" elapsed="0.000045"/>
</kw>
<kw name="验证单个Ticker数据结构">
<arg>${ticker_data}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="NOT RUN" start="2026-05-28T23:27:25.913420" elapsed="0.000049"/>
</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-28T23:27:25.913700" elapsed="0.000037"/>
</kw>
<doc>验证期货U本位单个Ticker接口功能（BTC交易对）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:24.212073" elapsed="1.702049">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-28T23:27:25.919769" 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-28T23:27:25.919069" elapsed="0.000738"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:25.921796" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:25.920262" elapsed="0.001700"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:25.920197" elapsed="0.001824"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:25.922113" elapsed="0.000093"/>
</return>
<msg time="2026-05-28T23:27:25.922687" 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-28T23:27:25.917693" elapsed="0.005031"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:26.037612" 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-28T23:27:26.037947" 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 15: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': 'a02e488baf1f5f16-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:26.038136" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:26.038503" 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-28T23:27:25.924228" elapsed="0.114751">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-28T23:27:26.039219" elapsed="0.000068"/>
</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-28T23:27:25.923167" elapsed="0.116280">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-28T23:27:26.039828" elapsed="0.000041"/>
</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-28T23:27:26.040018" elapsed="0.000016"/>
</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-28T23:27:26.040124" elapsed="0.000015"/>
</kw>
<kw name="验证单个Ticker数据结构">
<arg>${ticker_data}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="NOT RUN" start="2026-05-28T23:27:26.040345" elapsed="0.000018"/>
</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-28T23:27:26.040496" elapsed="0.000039"/>
</kw>
<doc>验证期货U本位单个Ticker接口功能（ETH交易对）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:25.914569" elapsed="0.126393">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-28T23:27:26.046296" 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-28T23:27:26.045076" elapsed="0.001271"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:26.047220" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:26.046543" elapsed="0.000766"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:26.046503" elapsed="0.000944"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:26.047500" elapsed="0.000052"/>
</return>
<msg time="2026-05-28T23:27:26.047861" 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-28T23:27:26.044151" elapsed="0.003780"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:26.161705" 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-28T23:27:26.161954" 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 15: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': 'a02e488c69005f16-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:26.162127" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:26.162404" 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-28T23:27:26.049122" elapsed="0.113712">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-28T23:27:26.162954" elapsed="0.000040"/>
</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-28T23:27:26.048324" elapsed="0.114785">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-28T23:27:26.163386" elapsed="0.000033"/>
</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-28T23:27:26.163540" elapsed="0.000016"/>
</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-28T23:27:26.163641" elapsed="0.000015"/>
</kw>
<kw name="验证单个Ticker数据结构">
<arg>${ticker_data}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="NOT RUN" start="2026-05-28T23:27:26.163874" elapsed="0.000046"/>
</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-28T23:27:26.164134" elapsed="0.000035"/>
</kw>
<doc>验证期货U本位单个Ticker接口功能（SOL交易对）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:26.041484" elapsed="0.122931">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-28T23:27:26.168892" 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-28T23:27:26.167996" elapsed="0.000942"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:26.169956" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:26.169194" elapsed="0.000907"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:26.169145" elapsed="0.001003"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:26.170220" elapsed="0.000079"/>
</return>
<msg time="2026-05-28T23:27:26.170725" 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-28T23:27:26.167050" elapsed="0.003723"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:26.285350" 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-28T23:27:26.285548" 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 15: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': 'a02e488d3b7a5f16-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:26.285626" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:26.285763" 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-28T23:27:26.172028" elapsed="0.113935">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-28T23:27:26.286105" elapsed="0.000035"/>
</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-28T23:27:26.171198" elapsed="0.115067">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-28T23:27:26.286560" elapsed="0.000034"/>
</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-28T23:27:26.286711" elapsed="0.000016"/>
</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-28T23:27:26.286818" elapsed="0.000016"/>
</kw>
<doc>验证期货U本位单个Ticker接口对无效交易对的处理</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:26.164638" elapsed="0.122537">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-28T23:27:26.291999" 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-28T23:27:26.291234" 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-28T23:27:26.292810" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:26.292227" elapsed="0.000643"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:26.292184" elapsed="0.000710"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:26.292934" elapsed="0.000047"/>
</return>
<msg time="2026-05-28T23:27:26.293186" 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-28T23:27:26.289982" elapsed="0.003226"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:26.408439" 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-28T23:27:26.408703" 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 15: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': 'a02e488dfd775f16-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:26.408890" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:26.409243" 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-28T23:27:26.294607" elapsed="0.115032">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-28T23:27:26.409844" elapsed="0.000059"/>
</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-28T23:27:26.293410" elapsed="0.116726">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-28T23:27:26.410360" elapsed="0.000025"/>
</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-28T23:27:26.410474" elapsed="0.000015"/>
</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-28T23:27:26.410570" elapsed="0.000016"/>
</kw>
<doc>验证期货U本位单个Ticker接口对缺少symbol参数的处理</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:26.287629" elapsed="0.123168">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-28T23:27:24.197784" elapsed="2.213513"/>
</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-28T23:27:26.420125" 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-28T23:27:26.419930" elapsed="0.000229"/>
</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-28T23:27:26.420506" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:26.420247" elapsed="0.000343"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:26.421041" 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-28T23:27:26.420780" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:26.420629" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:26.420225" elapsed="0.000978"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:26.422950" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:26.422356" elapsed="0.000664"/>
</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-28T23:27:26.423381" elapsed="0.000034"/>
</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-28T23:27:26.423590" elapsed="0.000046"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<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-28T23:27:26.423866" elapsed="0.000044"/>
</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-28T23:27:26.424125" elapsed="0.000050"/>
</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-28T23:27:26.424371" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:26.423129" elapsed="0.001305"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:26.425152" 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-28T23:27:26.424697" elapsed="0.000509"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:26.425516" 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-28T23:27:26.425326" elapsed="0.000223"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:26.425807" 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-28T23:27:26.425636" elapsed="0.000201"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:26.426237" 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-28T23:27:26.425953" elapsed="0.000326"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:26.426606" 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-28T23:27:26.426385" elapsed="0.000270"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:26.427173" 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-28T23:27:26.426873" elapsed="0.000345"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:26.427532" 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-28T23:27:26.427333" elapsed="0.000230"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:26.427944" 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-28T23:27:26.427751" elapsed="0.000224"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:26.428258" 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-28T23:27:26.428073" elapsed="0.000214"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:26.424473" elapsed="0.003849"/>
</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-28T23:27:26.428488" 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-28T23:27:26.428589" 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-28T23:27:26.428691" 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-28T23:27:26.428787" 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-28T23:27:26.428879" 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-28T23:27:26.428979" 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-28T23:27:26.429072" 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-28T23:27:26.429173" 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-28T23:27:26.429264" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:26.428375" elapsed="0.000930"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:26.423098" elapsed="0.006229"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:26.429677" 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-28T23:27:26.429425" elapsed="0.000309"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:26.430220" 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-28T23:27:26.429833" elapsed="0.000658"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:26.421807" elapsed="0.008775"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:26.430812" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:26.430702" elapsed="0.000148"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:26.419589" elapsed="0.011316"/>
</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-28T23:27:26.433759" 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-28T23:27:26.433090" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:26.434597" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:26.433936" elapsed="0.000726"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:26.433904" elapsed="0.000785"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:26.434739" elapsed="0.000053"/>
</return>
<msg time="2026-05-28T23:27:26.434981" 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-28T23:27:26.432324" elapsed="0.002682"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:27.915470" 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-28T23:27:27.915838" 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 15: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': 'a02e48976a96d771-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:27.915960" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:27.916137" 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-28T23:27:26.435588" elapsed="1.480827">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-28T23:27:27.916611" elapsed="0.000098"/>
</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-28T23:27:26.435191" elapsed="1.481722">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-28T23:27:27.917322" elapsed="0.000049"/>
</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-28T23:27:27.917569" elapsed="0.000020"/>
</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-28T23:27:27.917692" elapsed="0.000015"/>
</kw>
<for flavor="IN">
<iter>
<kw name="验证Ticker数据结构">
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="NOT RUN" start="2026-05-28T23:27:27.918517" elapsed="0.000031"/>
</kw>
<var name="${ticker}"/>
<status status="NOT RUN" start="2026-05-28T23:27:27.918014" elapsed="0.000566"/>
</iter>
<var>${ticker}</var>
<value>@{tickers_list}</value>
<status status="NOT RUN" start="2026-05-28T23:27:27.917839" elapsed="0.000774"/>
</for>
<doc>验证期货U本位Tickers接口功能</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:26.431012" elapsed="1.487849">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-28T23:27:27.927848" 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-28T23:27:27.927053" elapsed="0.000855"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:27.928763" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:27.928158" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:27.928115" elapsed="0.000730"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:27.928882" elapsed="0.000042"/>
</return>
<msg time="2026-05-28T23:27:27.929086" 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-28T23:27:27.925439" elapsed="0.003669"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:28.121905" 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-28T23:27:28.122377" 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 15: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': 'a02e48982cefd771-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:28.122777" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:28.123128" 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-28T23:27:27.929607" elapsed="0.193959">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-28T23:27:28.123822" elapsed="0.000079"/>
</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-28T23:27:27.929266" elapsed="0.194908">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-28T23:27:28.124730" 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-28T23:27:28.125081" elapsed="0.000042"/>
</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-28T23:27:28.125333" elapsed="0.000035"/>
</kw>
<for flavor="IN">
<iter>
<kw name="验证Ticker数据结构">
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="NOT RUN" start="2026-05-28T23:27:28.126021" elapsed="0.000047"/>
</kw>
<var name="${ticker}"/>
<status status="NOT RUN" start="2026-05-28T23:27:28.125612" elapsed="0.000523"/>
</iter>
<var>${ticker}</var>
<value>@{tickers_list}</value>
<status status="NOT RUN" start="2026-05-28T23:27:28.125486" elapsed="0.000705"/>
</for>
<doc>验证期货U本位Tickers接口功能（仅预测交易对）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:27.919140" elapsed="0.207405">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-28T23:27:28.133178" 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-28T23:27:28.132061" elapsed="0.001170"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:28.134310" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:28.133448" elapsed="0.000954"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:28.133415" elapsed="0.001024"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:28.134493" elapsed="0.000046"/>
</return>
<msg time="2026-05-28T23:27:28.134802" 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-28T23:27:28.130711" elapsed="0.004131"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:28.246760" 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-28T23:27:28.246969" 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 15: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': 'a02e4899788cd771-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:28.247144" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:28.247517" 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-28T23:27:28.135572" elapsed="0.112408">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-28T23:27:28.248151" elapsed="0.000064"/>
</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-28T23:27:28.135048" elapsed="0.113337">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-28T23:27:28.248914" elapsed="0.000046"/>
</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-28T23:27:28.249114" elapsed="0.000021"/>
</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-28T23:27:28.249235" elapsed="0.000015"/>
</kw>
<for flavor="IN">
<iter>
<kw name="验证Ticker数据结构">
<arg>${ticker}</arg>
<doc>验证单个Ticker数据的结构和格式</doc>
<status status="NOT RUN" start="2026-05-28T23:27:28.249609" elapsed="0.000029"/>
</kw>
<var name="${ticker}"/>
<status status="NOT RUN" start="2026-05-28T23:27:28.249377" elapsed="0.000297"/>
</iter>
<var>${ticker}</var>
<value>@{tickers_list}</value>
<status status="NOT RUN" start="2026-05-28T23:27:28.249308" elapsed="0.000397"/>
</for>
<doc>验证期货U本位Tickers接口功能（仅交割交易对）</doc>
<tag>future-u</tag>
<status status="FAIL" start="2026-05-28T23:27:28.127041" elapsed="0.123052">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-28T23:27:26.413825" elapsed="1.837058"/>
</suite>
<status status="FAIL" start="2026-05-28T23:27:17.887595" elapsed="10.365176"/>
</suite>
<status status="FAIL" start="2026-05-28T23:27:17.221453" elapsed="11.033868"/>
</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-28T23:27:28.266051" 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-28T23:27:28.265784" elapsed="0.000305"/>
</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-28T23:27:28.266882" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:28.266200" elapsed="0.000749"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.267282" 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-28T23:27:28.267088" elapsed="0.000253"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:28.266983" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:28.266173" elapsed="0.001233"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.268312" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:28.268170" 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-28T23:27:28.268621" 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-28T23:27:28.268726" 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-28T23:27:28.268825" 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-28T23:27:28.268922" 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-28T23:27:28.269025" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:28.268447" elapsed="0.000622"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.269435" 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-28T23:27:28.269226" elapsed="0.000245"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.269749" 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-28T23:27:28.269567" elapsed="0.000216"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.270041" 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-28T23:27:28.269875" elapsed="0.000198"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.270329" 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-28T23:27:28.270161" elapsed="0.000200"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.270625" 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-28T23:27:28.270451" elapsed="0.000206"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.270923" 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-28T23:27:28.270749" elapsed="0.000273"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.271407" 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-28T23:27:28.271127" elapsed="0.000332"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.271801" 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-28T23:27:28.271587" elapsed="0.000251"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.272143" 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-28T23:27:28.271942" elapsed="0.000241"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:28.269091" elapsed="0.003134"/>
</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-28T23:27:28.272381" 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-28T23:27:28.272501" 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-28T23:27:28.272625" elapsed="0.000035"/>
</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-28T23:27:28.272766" 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-28T23:27:28.272896" elapsed="0.000023"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:28.273030" 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-28T23:27:28.273145" 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-28T23:27:28.273245" 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-28T23:27:28.273354" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:28.272270" elapsed="0.001126"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:28.268423" elapsed="0.004996"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.273956" 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-28T23:27:28.273507" elapsed="0.000504"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:28.274379" 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-28T23:27:28.274134" elapsed="0.000395"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:28.267846" elapsed="0.006748"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.274764" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:28.274689" elapsed="0.000104"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:28.265341" elapsed="0.009487"/>
</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-28T23:27:28.275762" elapsed="0.000186"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.276184" 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-28T23:27:28.276041" elapsed="0.000160"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.276397" 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-28T23:27:28.276280" elapsed="0.000134"/>
</kw>
<if>
<branch type="IF" condition="'${access_token}' == '${EMPTY}' or '${refresh_token}' == '${EMPTY}'">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.277279" 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-28T23:27:28.277160" elapsed="0.000136"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.277494" 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-28T23:27:28.277371" elapsed="0.000139"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-28T23:27:28.277887" 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-28T23:27:28.277678" elapsed="0.000261">File '/Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_prod.json' does not exist.</status>
</kw>
<msg time="2026-05-28T23:27:28.278000" 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-28T23:27:28.277585" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="not ${token_file_exists}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.278345" 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-28T23:27:28.278239" elapsed="0.000124"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-28T23:27:28.278664" 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-28T23:27:28.278532" elapsed="0.000171">File '/Users/lihu/.jenkins/workspace/bitradex-api-automation/.bitradex_tokens_prod.json' does not exist.</status>
</kw>
<msg time="2026-05-28T23:27:28.278763" 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-28T23:27:28.278444" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:28.278113" elapsed="0.000697"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:28.278099" elapsed="0.000729"/>
</if>
<if>
<branch type="IF" condition="not ${token_file_exists}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.279071" 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-28T23:27:28.278969" elapsed="0.000118"/>
</kw>
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-05-28T23:27:28.279267" 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-28T23:27:28.279154" elapsed="0.000144"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:28.278863" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:28.278853" elapsed="0.000480"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-05-28T23:27:28.279485" 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-28T23:27:28.280876" 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-28T23:27:28.279395" elapsed="0.001498"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.281197" 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-28T23:27:28.280971" elapsed="0.000244"/>
</kw>
<if>
<branch type="IF" condition="'${access_token}' == '${EMPTY}'">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T23:27:28.281718" 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-28T23:27:28.281608" elapsed="0.000126"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:28.281260" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:28.281249" elapsed="0.000523"/>
</if>
<if>
<branch type="IF" condition="'${refresh_token}' == '${EMPTY}'">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-05-28T23:27:28.282231" 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-28T23:27:28.282124" elapsed="0.000125"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:28.281803" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:28.281793" elapsed="0.000491"/>
</if>
<status status="PASS" start="2026-05-28T23:27:28.276479" elapsed="0.005818"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:28.276460" elapsed="0.005850"/>
</if>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.282449" 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-28T23:27:28.282374" elapsed="0.000100"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.282602" 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-28T23:27:28.282533" elapsed="0.000094"/>
</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-28T23:27:28.282695" elapsed="0.000087"/>
</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-28T23:27:28.282853" elapsed="0.000078"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.283083" 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-28T23:27:28.282995" elapsed="0.000102"/>
</kw>
<if>
<branch type="IF" condition="'${user_id}' == '${EMPTY}'">
<kw name="Split String" owner="String">
<msg time="2026-05-28T23:27:28.283554" 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-28T23:27:28.283447" elapsed="0.000123"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.284209" 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-28T23:27:28.283635" elapsed="0.000667"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.284823" 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-28T23:27:28.284421" elapsed="0.000420"/>
</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-28T23:27:28.285071" elapsed="0.000117"/>
</kw>
<msg time="2026-05-28T23:27:28.285251" 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-28T23:27:28.284932" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="${has_user_id}">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.285769" 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-28T23:27:28.285412" elapsed="0.000375"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:28.285319" elapsed="0.000491"/>
</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-28T23:27:28.285889" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:28.285824" elapsed="0.000097"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:28.285306" elapsed="0.000627"/>
</if>
<status status="PASS" start="2026-05-28T23:27:28.283136" elapsed="0.002810"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:28.283126" elapsed="0.002832"/>
</if>
<kw name="Convert To String" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.286165" 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-28T23:27:28.286043" elapsed="0.000137"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.286406" 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-28T23:27:28.286249" elapsed="0.000173"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.287732" 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-28T23:27:28.287114" 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="PASS" start="2026-05-28T23:27:28.288427" elapsed="0.000221"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:28.287877" elapsed="0.000812"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:28.287860" elapsed="0.000850"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:28.288742" elapsed="0.000034"/>
</return>
<msg time="2026-05-28T23:27:28.288944" 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-28T23:27:28.286591" elapsed="0.002377"/>
</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-28T23:27:28.289076" elapsed="0.000167"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:28.754570" 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-28T23:27:28.755104" 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 15: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': 'a02e489ca9b13f1b-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:28.755304" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:28.755663" 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-28T23:27:28.289346" elapsed="0.466382"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-05-28T23:27:28.758893" 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-28T23:27:28.756944" elapsed="0.002119">Resolving variable '${response.json()}' failed: JSONDecodeError: Expecting value: line 1 column 1 (char 0)</status>
</kw>
<msg time="2026-05-28T23:27:28.759389" 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-28T23:27:28.756376" elapsed="0.003076"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.760878" 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-28T23:27:28.759864" elapsed="0.001128"/>
</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-28T23:27:28.761486" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:28.761181" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:28.761128" elapsed="0.000463"/>
</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-28T23:27:28.762453" elapsed="0.000026"/>
</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-28T23:27:28.762665" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:28.762571" elapsed="0.000139"/>
</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-28T23:27:28.762811" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:28.762734" elapsed="0.000118"/>
</branch>
<status status="NOT RUN" start="2026-05-28T23:27:28.762556" elapsed="0.000314"/>
</if>
<status status="NOT RUN" start="2026-05-28T23:27:28.761661" elapsed="0.001229"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:28.761644" elapsed="0.001264"/>
</if>
<kw name="验证接口响应成功" owner="common">
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.764149" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-05-28T23:27:28.764308" 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-28T23:27:28.763596" elapsed="0.000802">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-28T23:27:28.764527" elapsed="0.000020"/>
</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-28T23:27:28.764638" elapsed="0.000014"/>
</kw>
<arg>${response}</arg>
<doc>验证接口响应状态码为200</doc>
<status status="FAIL" start="2026-05-28T23:27:28.763150" elapsed="0.001612">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-28T23:27:28.764877" elapsed="0.000015"/>
</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-28T23:27:28.764985" elapsed="0.000138"/>
</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-28T23:27:28.765221" elapsed="0.000015"/>
</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-28T23:27:28.765427" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:28.765323" elapsed="0.000145"/>
</branch>
<status status="NOT RUN" start="2026-05-28T23:27:28.765293" elapsed="0.000201"/>
</if>
<kw name="验证响应字段值" owner="common">
<arg>${response}</arg>
<arg>code</arg>
<arg>${0}</arg>
<doc>验证响应JSON字段的值</doc>
<status status="NOT RUN" start="2026-05-28T23:27:28.765782" elapsed="0.000036"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T23:27:28.765952" elapsed="0.000021"/>
</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-28T23:27:28.766067" elapsed="0.000015"/>
</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-28T23:27:28.766166" elapsed="0.000014"/>
</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-28T23:27:28.766260" elapsed="0.000017"/>
</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-28T23:27:28.766368" elapsed="0.000013"/>
</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-28T23:27:28.766486" elapsed="0.000015"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T23:27:28.766708" elapsed="0.000026"/>
</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-28T23:27:28.766867" elapsed="0.000018"/>
</kw>
<doc>验证获取用户收益信息接口功能</doc>
<tag>invite</tag>
<tag>profit</tag>
<status status="FAIL" start="2026-05-28T23:27:28.274882" elapsed="0.492252">456 != 200</status>
</test>
<doc>用户及团队收益分析-获取用户收益信息</doc>
<status status="FAIL" start="2026-05-28T23:27:28.258861" elapsed="0.508680"/>
</suite>
<status status="FAIL" start="2026-05-28T23:27:28.256511" elapsed="0.512267"/>
</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-28T23:27:28.780191" 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-28T23:27:28.779915" elapsed="0.000324"/>
</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-28T23:27:28.780646" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:28.780372" elapsed="0.000344"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.781027" 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-28T23:27:28.780834" elapsed="0.000245"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:28.780746" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:28.780340" elapsed="0.000792"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.781963" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:28.781798" elapsed="0.000238"/>
</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-28T23:27:28.782383" 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-28T23:27:28.782499" 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-28T23:27:28.782599" 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-28T23:27:28.782699" 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-28T23:27:28.782815" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:28.782113" elapsed="0.000798"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.783636" 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-28T23:27:28.783133" elapsed="0.000560"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.784084" 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-28T23:27:28.783838" elapsed="0.000293"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.784443" 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-28T23:27:28.784258" elapsed="0.000212"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.784839" 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-28T23:27:28.784663" elapsed="0.000206"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.785109" 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-28T23:27:28.784955" elapsed="0.000181"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.785431" 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-28T23:27:28.785214" elapsed="0.000260"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.785838" 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-28T23:27:28.785595" elapsed="0.000287"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.786245" 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-28T23:27:28.786000" elapsed="0.000286"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.786654" 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-28T23:27:28.786406" elapsed="0.000294"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:28.782935" elapsed="0.003803"/>
</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-28T23:27:28.786888" 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-28T23:27:28.787021" 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-28T23:27:28.787147" 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-28T23:27:28.787269" 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-28T23:27:28.787374" 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-28T23:27:28.787479" 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-28T23:27:28.787579" 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-28T23:27:28.787678" 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-28T23:27:28.787777" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:28.786767" elapsed="0.001053"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:28.782091" elapsed="0.005748"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.788103" 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-28T23:27:28.787926" elapsed="0.000224"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:28.788554" 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-28T23:27:28.788252" elapsed="0.000493"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:28.781467" elapsed="0.007349"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.789008" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:28.788918" elapsed="0.000129"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:28.779499" elapsed="0.009598"/>
</kw>
<test id="s1-s4-s1-s1-t1" name="获取余额货币列表" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.790425" 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-28T23:27:28.790226" elapsed="0.000225"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:28.791964" 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-28T23:27:28.791376" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:28.792615" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:28.792111" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:28.792091" elapsed="0.000650"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:28.792775" elapsed="0.000033"/>
</return>
<msg time="2026-05-28T23:27:28.792976" 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-28T23:27:28.790664" elapsed="0.002337"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:29.503447" 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-28T23:27:29.503764" 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 15: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': 'a02e48a158fbafb1-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:29.503919" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:29.504168" 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-28T23:27:28.793107" elapsed="0.711095"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T23:27:29.505888" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-05-28T23:27:29.506072" 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-28T23:27:29.504728" elapsed="0.001453">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-28T23:27:29.506413" elapsed="0.000029"/>
</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-28T23:27:29.506545" elapsed="0.000016"/>
</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-28T23:27:29.506658" elapsed="0.000014"/>
</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-28T23:27:29.506764" elapsed="0.000013"/>
</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-28T23:27:29.506869" elapsed="0.000016"/>
</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-28T23:27:29.506989" 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-28T23:27:29.507118" elapsed="0.000015"/>
</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-28T23:27:29.507231" elapsed="0.000014"/>
</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-28T23:27:29.507338" elapsed="0.000014"/>
</kw>
<doc>验证余额货币列表接口功能</doc>
<tag>spot</tag>
<status status="FAIL" start="2026-05-28T23:27:28.789163" elapsed="0.718581">456 != 200</status>
</test>
<doc>余额货币列表接口测试</doc>
<status status="FAIL" start="2026-05-28T23:27:28.775924" elapsed="0.732264"/>
</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-28T23:27:29.517543" 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-28T23:27:29.517165" elapsed="0.000443"/>
</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-28T23:27:29.518135" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:29.517791" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:29.518524" 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-28T23:27:29.518344" elapsed="0.000236"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:29.518233" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:29.517745" elapsed="0.000899"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:29.519499" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:29.519351" elapsed="0.000592"/>
</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-28T23:27:29.520291" 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-28T23:27:29.520444" 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-28T23:27:29.520589" 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-28T23:27:29.520728" 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-28T23:27:29.520868" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:29.520041" elapsed="0.000892"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:29.521464" 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-28T23:27:29.521142" elapsed="0.000379"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:29.521981" 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-28T23:27:29.521672" elapsed="0.000402"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:29.522612" 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-28T23:27:29.522276" elapsed="0.000401"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:29.523158" 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-28T23:27:29.522850" elapsed="0.000362"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:29.523668" 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-28T23:27:29.523367" elapsed="0.000347"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:29.524126" 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-28T23:27:29.523857" elapsed="0.000315"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:29.524599" 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-28T23:27:29.524305" elapsed="0.000341"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:29.525089" 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-28T23:27:29.524789" elapsed="0.000349"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:29.525553" 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-28T23:27:29.525272" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:29.520962" elapsed="0.004685"/>
</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-28T23:27:29.525829" 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-28T23:27:29.525977" 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-28T23:27:29.526138" elapsed="0.000021"/>
</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-28T23:27:29.526279" 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-28T23:27:29.526418" elapsed="0.000023"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${CLIENT_CODE}</arg>
<arg>9F387CCE-760C-4AED-80BB-787B82D2C94D</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:29.526559" elapsed="0.000021"/>
</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-28T23:27:29.526697" elapsed="0.000020"/>
</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-28T23:27:29.526930" elapsed="0.000024"/>
</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-28T23:27:29.527065" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:29.525698" elapsed="0.001417"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:29.520015" elapsed="0.007124"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:29.527479" 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-28T23:27:29.527254" elapsed="0.000279"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:29.528000" 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-28T23:27:29.527637" elapsed="0.000625"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:29.519019" elapsed="0.009414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:29.528625" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:29.528541" elapsed="0.000121"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:29.516645" elapsed="0.012069"/>
</kw>
<test id="s1-s4-s1-s2-t1" name="获取货币价格转换" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:29.530332" 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-28T23:27:29.530104" elapsed="0.000252"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:29.531992" 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-28T23:27:29.531433" elapsed="0.000583"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:29.532634" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:29.532135" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:29.532111" elapsed="0.000592"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:29.532744" elapsed="0.000035"/>
</return>
<msg time="2026-05-28T23:27:29.532915" 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-28T23:27:29.530642" elapsed="0.002294"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:30.539769" 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-28T23:27:30.539925" 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 15: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': 'a02e48a7cb86eb8c-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:30.540016" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:30.540296" 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-28T23:27:29.533021" elapsed="1.007336"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T23:27:30.542036" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-05-28T23:27:30.542267" 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-28T23:27:30.540791" elapsed="0.001627">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-28T23:27:30.542762" elapsed="0.000051"/>
</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-28T23:27:30.543050" elapsed="0.000038"/>
</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-28T23:27:30.543304" elapsed="0.000037"/>
</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-28T23:27:30.543532" elapsed="0.000015"/>
</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-28T23:27:30.543631" elapsed="0.000014"/>
</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-28T23:27:30.543728" elapsed="0.000014"/>
</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-28T23:27:30.543837" elapsed="0.000013"/>
</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-28T23:27:30.544000" elapsed="0.000014"/>
</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-28T23:27:30.544096" elapsed="0.000013"/>
</kw>
<doc>验证货币价格转换接口功能</doc>
<tag>spot</tag>
<status status="FAIL" start="2026-05-28T23:27:29.528814" elapsed="1.015480">456 != 200</status>
</test>
<test id="s1-s4-s1-s2-t2" name="获取单一货币价格转换" line="37">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:30.548018" 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-28T23:27:30.547758" elapsed="0.000285"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:30.550803" 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-28T23:27:30.549701" elapsed="0.001148"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:30.551818" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:30.551075" elapsed="0.000806"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:30.551036" elapsed="0.000874"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:30.551953" elapsed="0.000044"/>
</return>
<msg time="2026-05-28T23:27:30.552200" 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-28T23:27:30.548297" elapsed="0.003927"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:30.743058" 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-28T23:27:30.743338" 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 15: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': 'a02e48a89bfeeb8c-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:30.743486" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:30.743693" 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-28T23:27:30.552344" elapsed="0.191384"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T23:27:30.744582" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-05-28T23:27:30.744694" 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-28T23:27:30.743984" elapsed="0.000778">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-28T23:27:30.744904" elapsed="0.000020"/>
</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-28T23:27:30.745116" 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-28T23:27:30.745382" elapsed="0.000041"/>
</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-28T23:27:30.745656" elapsed="0.000040"/>
</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-28T23:27:30.745913" elapsed="0.000036"/>
</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-28T23:27:30.746158" elapsed="0.000035"/>
</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-28T23:27:30.746428" 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-28T23:27:30.746783" 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-28T23:27:30.747037" elapsed="0.000036"/>
</kw>
<doc>验证单一货币价格转换接口功能</doc>
<tag>spot</tag>
<status status="FAIL" start="2026-05-28T23:27:30.544778" elapsed="0.202656">456 != 200</status>
</test>
<doc>货币价格转换接口测试</doc>
<status status="FAIL" start="2026-05-28T23:27:29.509250" elapsed="1.238642"/>
</suite>
<status status="FAIL" start="2026-05-28T23:27:28.773368" elapsed="1.975601"/>
</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-28T23:27:30.757064" 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-28T23:27:30.756822" elapsed="0.000280"/>
</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-28T23:27:30.757483" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:30.757225" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:30.757849" 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-28T23:27:30.757654" elapsed="0.000254"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:30.757552" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:30.757195" elapsed="0.000781"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:30.758893" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:30.758741" elapsed="0.000206"/>
</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-28T23:27:30.759235" 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-28T23:27:30.759385" 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-28T23:27:30.759525" elapsed="0.000021"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:30.759667" 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-28T23:27:30.759807" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:30.759029" elapsed="0.000839"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:30.760348" 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-28T23:27:30.760086" elapsed="0.000297"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:30.760649" 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-28T23:27:30.760474" elapsed="0.000209"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:30.760934" 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-28T23:27:30.760766" elapsed="0.000197"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:30.761219" 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-28T23:27:30.761048" elapsed="0.000202"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:30.761504" 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-28T23:27:30.761333" elapsed="0.000200"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:30.761792" 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-28T23:27:30.761618" elapsed="0.000204"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:30.762103" 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-28T23:27:30.761916" elapsed="0.000217"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:30.762406" 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-28T23:27:30.762222" elapsed="0.000215"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:30.762713" 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-28T23:27:30.762524" elapsed="0.000220"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:30.759901" elapsed="0.002875"/>
</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-28T23:27:30.762904" 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-28T23:27:30.762998" 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-28T23:27:30.763185" 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-28T23:27:30.763278" 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-28T23:27:30.763369" 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-28T23:27:30.763462" 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-28T23:27:30.763554" 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-28T23:27:30.763645" 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-28T23:27:30.763735" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:30.762808" elapsed="0.000967"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:30.759008" elapsed="0.004788"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:30.764123" 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-28T23:27:30.763889" elapsed="0.000288"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:30.764769" 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-28T23:27:30.764334" elapsed="0.000738"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:30.758381" elapsed="0.006795"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:30.765744" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:30.765459" elapsed="0.000354"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:30.756384" elapsed="0.009488"/>
</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-28T23:27:30.771073" 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-28T23:27:30.770272" elapsed="0.000834"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:30.771885" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:30.771226" elapsed="0.000735"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:30.771207" elapsed="0.000781"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:30.772027" elapsed="0.000037"/>
</return>
<msg time="2026-05-28T23:27:30.772270" 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-28T23:27:30.768493" elapsed="0.003808"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:31.169808" 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-28T23:27:31.170110" 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 15:27:31 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': 'a02e48abbbcf248d-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:31.170255" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:31.174357" 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-28T23:27:30.772432" elapsed="0.402048"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T23:27:31.175809" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-05-28T23:27:31.175990" 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-28T23:27:31.174884" elapsed="0.001214">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-28T23:27:31.176415" elapsed="0.000036"/>
</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-28T23:27:31.176542" elapsed="0.000015"/>
</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-28T23:27:31.176648" elapsed="0.000019"/>
</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-28T23:27:31.176864" elapsed="0.000015"/>
</kw>
<doc>验证24小时行情接口基本功能获取24小时行情数据</doc>
<tag>market</tag>
<status status="FAIL" start="2026-05-28T23:27:30.765963" elapsed="0.411152">456 != 200</status>
</test>
<doc>24小时行情</doc>
<status status="FAIL" start="2026-05-28T23:27:30.752041" elapsed="0.425554"/>
</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-28T23:27:31.184120" 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-28T23:27:31.183844" elapsed="0.000317"/>
</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-28T23:27:31.184599" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:31.184291" elapsed="0.000358"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:31.184891" 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-28T23:27:31.184753" elapsed="0.000176"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:31.184672" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:31.184255" elapsed="0.000717"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:31.186194" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:31.186016" elapsed="0.000246"/>
</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-28T23:27:31.186587" 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-28T23:27:31.186691" 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-28T23:27:31.186785" 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-28T23:27:31.186875" 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-28T23:27:31.187003" elapsed="0.000018"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:31.186364" elapsed="0.000695"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:31.187644" 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-28T23:27:31.187291" elapsed="0.000412"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:31.188112" 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-28T23:27:31.187834" elapsed="0.000349"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:31.188629" 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-28T23:27:31.188338" elapsed="0.000334"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:31.189043" 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-28T23:27:31.188801" elapsed="0.000280"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:31.189393" 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-28T23:27:31.189188" elapsed="0.000235"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:31.189679" 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-28T23:27:31.189511" elapsed="0.000232"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:31.190009" 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-28T23:27:31.189830" elapsed="0.000208"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:31.190326" 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-28T23:27:31.190120" elapsed="0.000239"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:31.190672" 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-28T23:27:31.190456" elapsed="0.000254"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:31.187095" elapsed="0.003786"/>
</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-28T23:27:31.191026" 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-28T23:27:31.191136" 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-28T23:27:31.191239" 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-28T23:27:31.191342" 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-28T23:27:31.191451" 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-28T23:27:31.191544" 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-28T23:27:31.191643" 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-28T23:27:31.191738" 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-28T23:27:31.191826" elapsed="0.000013"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:31.190918" elapsed="0.000947"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:31.186336" elapsed="0.005547"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:31.192155" 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-28T23:27:31.191972" elapsed="0.000227"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:31.192626" 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-28T23:27:31.192287" elapsed="0.000593"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:31.185593" elapsed="0.007366"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:31.193143" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:31.193064" elapsed="0.000115"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:31.183485" elapsed="0.009745"/>
</kw>
<test id="s1-s4-s2-s2-t1" name="获取市场深度数据" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:31.194724" 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-28T23:27:31.194499" elapsed="0.000247"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:31.196338" 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-28T23:27:31.195778" elapsed="0.000583"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:31.196953" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:31.196474" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:31.196452" elapsed="0.000570"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:31.197058" elapsed="0.000048"/>
</return>
<msg time="2026-05-28T23:27:31.197255" 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-28T23:27:31.195023" elapsed="0.002253"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:33.221664" 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-28T23:27:33.221898" 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 15: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': 'a02e48b88875decd-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:33.222205" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:33.222558" 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-28T23:27:31.197361" elapsed="2.025229"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<msg time="2026-05-28T23:27:33.224007" level="INFO">Argument types are:
&lt;class 'int'&gt;
&lt;class 'str'&gt;</msg>
<msg time="2026-05-28T23:27:33.224147" 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-28T23:27:33.223077" elapsed="0.001146">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-28T23:27:33.224497" elapsed="0.000037"/>
</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-28T23:27:33.224636" elapsed="0.000020"/>
</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-28T23:27:33.224750" elapsed="0.000016"/>
</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-28T23:27:33.224910" 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-28T23:27:33.225160" 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-28T23:27:33.225414" elapsed="0.000035"/>
</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-28T23:27:33.225693" 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-28T23:27:33.225956" elapsed="0.000027"/>
</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-28T23:27:33.226142" elapsed="0.000029"/>
</kw>
<doc>验证市场深度数据接口功能</doc>
<tag>market</tag>
<status status="FAIL" start="2026-05-28T23:27:31.193331" elapsed="2.033274">456 != 200</status>
</test>
<doc>市场深度数据接口测试</doc>
<status status="FAIL" start="2026-05-28T23:27:31.178529" elapsed="2.048692"/>
</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-28T23:27:33.233840" 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-28T23:27:33.233650" elapsed="0.000222"/>
</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-28T23:27:33.234185" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:33.233967" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:33.234750" 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-28T23:27:33.234467" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:33.234323" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:33.233944" elapsed="0.000997"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:33.236002" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:33.235761" elapsed="0.000312"/>
</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-28T23:27:33.236448" 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-28T23:27:33.236559" 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-28T23:27:33.236663" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:33.236760" 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-28T23:27:33.236854" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:33.236177" elapsed="0.000720"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:33.237651" 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-28T23:27:33.237092" elapsed="0.000679"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:33.238630" 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-28T23:27:33.238175" elapsed="0.000524"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:33.239073" 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-28T23:27:33.238857" elapsed="0.000247"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:33.239378" 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-28T23:27:33.239196" elapsed="0.000214"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:33.239698" 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-28T23:27:33.239507" elapsed="0.000235"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:33.240025" 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-28T23:27:33.239841" elapsed="0.000215"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:33.240334" 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-28T23:27:33.240145" elapsed="0.000222"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:33.240661" 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-28T23:27:33.240460" elapsed="0.000237"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:33.241031" 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-28T23:27:33.240806" elapsed="0.000264"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:33.236924" elapsed="0.004180"/>
</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-28T23:27:33.241309" 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-28T23:27:33.241427" 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-28T23:27:33.241533" 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-28T23:27:33.241625" 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-28T23:27:33.241721" 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-28T23:27:33.241816" 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-28T23:27:33.241913" 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-28T23:27:33.242078" elapsed="0.000026"/>
</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-28T23:27:33.242199" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:33.241174" elapsed="0.001070"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:33.236146" elapsed="0.006119"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:33.242599" 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-28T23:27:33.242356" elapsed="0.000297"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:33.243075" 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-28T23:27:33.242745" elapsed="0.000573"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:33.235364" elapsed="0.008051"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:33.243630" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:33.243554" elapsed="0.000110"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:33.233331" elapsed="0.010402"/>
</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-28T23:27:33.249587" 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-28T23:27:33.248906" 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-28T23:27:33.250201" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:33.249775" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:33.249756" elapsed="0.000509"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:33.250290" elapsed="0.000025"/>
</return>
<msg time="2026-05-28T23:27:33.250446" 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-28T23:27:33.247641" elapsed="0.002841"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:34.415764" 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-28T23:27:34.416054" 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 15: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': 'a02e48c0097aec10-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:34.416333" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:34.416746" 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-28T23:27:33.251533" elapsed="1.165713">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-28T23:27:34.417508" elapsed="0.000074"/>
</return>
<var>${response}</var>
<arg>/v1/spot/market/public/plate</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="FAIL" start="2026-05-28T23:27:33.250691" elapsed="1.167176">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-28T23:27:34.418465" elapsed="0.000072"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T23:27:34.418690" elapsed="0.000021"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T23:27:34.418824" elapsed="0.000022"/>
</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-28T23:27:34.418987" elapsed="0.000017"/>
</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-28T23:27:34.419092" elapsed="0.000014"/>
</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-28T23:27:34.419307" 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-28T23:27:34.419538" elapsed="0.000015"/>
</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-28T23:27:34.419709" elapsed="0.000022"/>
</kw>
<doc>验证市场盘口数据接口功能</doc>
<tag>market</tag>
<status status="FAIL" start="2026-05-28T23:27:33.243833" elapsed="1.176124">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-28T23:27:33.228197" elapsed="1.192166"/>
</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-28T23:27:34.429868" 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-28T23:27:34.429498" elapsed="0.000431"/>
</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-28T23:27:34.430474" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:34.430099" elapsed="0.000468"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.431022" 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-28T23:27:34.430713" elapsed="0.000389"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:34.430604" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:34.430047" elapsed="0.001121"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.432219" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:34.432067" elapsed="0.000340"/>
</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-28T23:27:34.432845" 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-28T23:27:34.432970" 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-28T23:27:34.433071" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:34.433168" 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-28T23:27:34.433267" elapsed="0.000014"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:34.432498" elapsed="0.000815"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.433902" 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-28T23:27:34.433472" elapsed="0.000550"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.434569" 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-28T23:27:34.434269" elapsed="0.000339"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.434914" 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-28T23:27:34.434721" elapsed="0.000224"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.435238" 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-28T23:27:34.435038" elapsed="0.000232"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.435557" 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-28T23:27:34.435364" elapsed="0.000230"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.435886" 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-28T23:27:34.435701" elapsed="0.000215"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.436207" 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-28T23:27:34.436010" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.436525" 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-28T23:27:34.436331" elapsed="0.000223"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.436872" 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-28T23:27:34.436641" elapsed="0.000268"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:34.433340" elapsed="0.003608"/>
</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-28T23:27:34.437117" 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-28T23:27:34.437248" 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-28T23:27:34.437399" 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-28T23:27:34.437520" 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-28T23:27:34.437650" 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-28T23:27:34.437788" 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-28T23:27:34.437906" 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-28T23:27:34.438021" 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-28T23:27:34.438139" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:34.437002" elapsed="0.001191"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:34.432472" elapsed="0.005756"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.438656" 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-28T23:27:34.438354" elapsed="0.000367"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:34.439239" 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-28T23:27:34.438836" elapsed="0.000764"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:34.431624" elapsed="0.008287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.440424" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:34.440140" elapsed="0.000338"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:34.428831" elapsed="0.011708"/>
</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-28T23:27:34.444822" 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-28T23:27:34.443977" elapsed="0.000889"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:34.445694" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:34.445039" elapsed="0.000728"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:34.445012" elapsed="0.000783"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:34.445835" elapsed="0.000037"/>
</return>
<msg time="2026-05-28T23:27:34.446075" 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-28T23:27:34.442738" elapsed="0.003367"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:34.936868" 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-28T23:27:34.937153" 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 15: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': 'a02e48c2bea1067d-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:34.937302" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:34.937577" 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-28T23:27:34.447160" elapsed="0.490832">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-28T23:27:34.938210" elapsed="0.000059"/>
</return>
<var>${response}</var>
<arg>/v1/spot/market/public/symbol</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="FAIL" start="2026-05-28T23:27:34.446302" elapsed="0.492189">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-28T23:27:34.938973" elapsed="0.000067"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T23:27:34.939339" elapsed="0.000041"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T23:27:34.939493" elapsed="0.000018"/>
</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-28T23:27:34.939634" elapsed="0.000016"/>
</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-28T23:27:34.939739" elapsed="0.000014"/>
</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-28T23:27:34.939851" elapsed="0.000013"/>
</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-28T23:27:34.939950" elapsed="0.000014"/>
</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-28T23:27:34.940099" elapsed="0.000018"/>
</kw>
<doc>验证市场交易对接口功能</doc>
<tag>market</tag>
<status status="FAIL" start="2026-05-28T23:27:34.440645" elapsed="0.499656">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-28T23:27:34.421472" elapsed="0.519356"/>
</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-28T23:27:34.948875" 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-28T23:27:34.948547" 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-28T23:27:34.949375" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:34.949062" elapsed="0.000380"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.949765" 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-28T23:27:34.949587" elapsed="0.000235"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:34.949475" elapsed="0.000387"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:34.949026" elapsed="0.000862"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.951020" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:34.950607" elapsed="0.000470"/>
</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-28T23:27:34.951379" 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-28T23:27:34.951530" 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-28T23:27:34.951671" 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-28T23:27:34.951809" 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-28T23:27:34.951913" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:34.951163" elapsed="0.000797"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.952342" 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-28T23:27:34.952120" elapsed="0.000258"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.952645" 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-28T23:27:34.952470" elapsed="0.000208"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.952955" 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-28T23:27:34.952769" elapsed="0.000214"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.953226" 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-28T23:27:34.953063" elapsed="0.000191"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.953498" 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-28T23:27:34.953334" elapsed="0.000192"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.953805" 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-28T23:27:34.953607" elapsed="0.000235"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.954179" 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-28T23:27:34.953948" elapsed="0.000267"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.954552" 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-28T23:27:34.954323" elapsed="0.000266"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.954942" 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-28T23:27:34.954705" elapsed="0.000275"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:34.951981" elapsed="0.003038"/>
</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-28T23:27:34.955160" 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-28T23:27:34.955280" 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-28T23:27:34.955409" 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-28T23:27:34.955531" 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-28T23:27:34.955652" 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-28T23:27:34.955772" 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-28T23:27:34.955974" 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-28T23:27:34.956072" 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-28T23:27:34.956166" elapsed="0.000012"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:34.955050" elapsed="0.001154"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:34.951140" elapsed="0.005082"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.956503" 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-28T23:27:34.956312" elapsed="0.000238"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:34.957032" 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-28T23:27:34.956640" elapsed="0.000778"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:34.950268" elapsed="0.007302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:34.957978" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:34.957790" elapsed="0.000281"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:34.948232" elapsed="0.009949"/>
</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-28T23:27:34.961764" 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-28T23:27:34.961042" elapsed="0.000761"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:34.962540" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:34.961974" elapsed="0.000622"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:34.961942" elapsed="0.000672"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:34.962642" elapsed="0.000026"/>
</return>
<msg time="2026-05-28T23:27:34.962813" 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-28T23:27:34.960019" elapsed="0.002813"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:35.365620" 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-28T23:27:35.365831" 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 15: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': 'a02e48c5f815fd4f-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:35.365925" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:35.366239" 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-28T23:27:34.963801" elapsed="0.402744">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-28T23:27:35.366697" elapsed="0.000042"/>
</return>
<var>${response}</var>
<arg>/v1/spot/market/public/time</arg>
<arg>headers=${headers}</arg>
<doc>发送GET请求</doc>
<status status="FAIL" start="2026-05-28T23:27:34.962956" elapsed="0.403928">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-28T23:27:35.367272" elapsed="0.000084"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T23:27:35.367567" elapsed="0.000037"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T23:27:35.368073" elapsed="0.000079"/>
</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-28T23:27:35.368594" elapsed="0.000039"/>
</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-28T23:27:35.368784" elapsed="0.000034"/>
</kw>
<kw name="验证时间数据">
<arg>${data}</arg>
<doc>验证时间数据的格式和有效性</doc>
<status status="NOT RUN" start="2026-05-28T23:27:35.369151" elapsed="0.000049"/>
</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-28T23:27:35.369391" elapsed="0.000021"/>
</kw>
<doc>验证市场服务器时间接口功能</doc>
<tag>market</tag>
<status status="FAIL" start="2026-05-28T23:27:34.958320" elapsed="0.411376">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-28T23:27:34.943023" elapsed="0.427232"/>
</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-28T23:27:35.379797" 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-28T23:27:35.379329" elapsed="0.001080"/>
</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-28T23:27:35.381353" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:35.380661" elapsed="0.000797"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:35.381934" 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-28T23:27:35.381635" elapsed="0.000373"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:35.381501" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:35.380580" elapsed="0.001487"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:35.383335" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:35.383166" elapsed="0.000227"/>
</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-28T23:27:35.383704" 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-28T23:27:35.383829" 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-28T23:27:35.383946" elapsed="0.000023"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:35.384070" 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-28T23:27:35.384176" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:35.383489" elapsed="0.000741"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:35.384762" 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-28T23:27:35.384425" elapsed="0.000385"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:35.385136" 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-28T23:27:35.384917" elapsed="0.000264"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:35.385502" 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-28T23:27:35.385294" elapsed="0.000240"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:35.385809" 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-28T23:27:35.385623" elapsed="0.000223"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:35.386160" 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-28T23:27:35.385951" elapsed="0.000244"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:35.386502" 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-28T23:27:35.386306" elapsed="0.000231"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:35.386837" 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-28T23:27:35.386631" elapsed="0.000240"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:35.387154" 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-28T23:27:35.386963" elapsed="0.000228"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:35.387517" 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-28T23:27:35.387294" elapsed="0.000267"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:35.384265" elapsed="0.003562"/>
</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-28T23:27:35.388031" elapsed="0.000024"/>
</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-28T23:27:35.388156" 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-28T23:27:35.388273" 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-28T23:27:35.388384" 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-28T23:27:35.388509" 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-28T23:27:35.388634" 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-28T23:27:35.388742" 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-28T23:27:35.388841" 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-28T23:27:35.388937" elapsed="0.000015"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:35.387893" elapsed="0.001085"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:35.383463" elapsed="0.005542"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:35.389423" 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-28T23:27:35.389110" elapsed="0.000374"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:35.390004" 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-28T23:27:35.389595" elapsed="0.001020"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:35.382707" elapsed="0.007999"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:35.390943" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:35.390828" elapsed="0.000153"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:35.378707" elapsed="0.012331"/>
</kw>
<test id="s1-s4-s2-s6-t1" name="获取热门市场排行榜" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:35.392766" 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-28T23:27:35.392526" elapsed="0.000265"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:35.394479" 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-28T23:27:35.393893" elapsed="0.000610"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<arg>token=${token}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:35.395157" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:35.394644" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:35.394611" elapsed="0.000623"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:35.395272" elapsed="0.000049"/>
</return>
<msg time="2026-05-28T23:27:35.395479" 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-28T23:27:35.393036" elapsed="0.002463"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:36.840530" 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-28T23:27:36.840846" 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 15: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': 'a02e48cf2add611a-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:36.841234" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:36.841548" 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-28T23:27:35.396027" elapsed="1.445999">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-28T23:27:36.842283" elapsed="0.000077"/>
</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-28T23:27:35.395647" elapsed="1.446963">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-28T23:27:36.843240" elapsed="0.000077"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T23:27:36.843571" elapsed="0.000023"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T23:27:36.843714" elapsed="0.000018"/>
</kw>
<doc>验证热门市场排行榜接口功能</doc>
<tag>market</tag>
<status status="FAIL" start="2026-05-28T23:27:35.391147" elapsed="1.452816">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-28T23:27:35.371625" elapsed="1.472765"/>
</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-28T23:27:36.851485" 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-28T23:27:36.851109" elapsed="0.000441"/>
</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-28T23:27:36.852053" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:36.851727" elapsed="0.000390"/>
</branch>
<branch type="ELSE">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:36.852431" 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-28T23:27:36.852241" elapsed="0.000244"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:36.852146" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:36.851684" elapsed="0.000853"/>
</if>
<kw name="设置测试环境" owner="common">
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:36.853398" level="INFO">设置环境: prod</msg>
<arg>设置环境: ${env}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:36.853247" elapsed="0.000198"/>
</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-28T23:27:36.853705" 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-28T23:27:36.853824" 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-28T23:27:36.853934" elapsed="0.000016"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<arg>${HOST_NAME}</arg>
<arg>api.example.com</arg>
<doc>Makes a variable available globally in all tests and suites.</doc>
<status status="NOT RUN" start="2026-05-28T23:27:36.854038" 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-28T23:27:36.854144" elapsed="0.000016"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:36.853514" elapsed="0.000676"/>
</branch>
<branch type="ELSE IF" condition="'${env}' == 'prod'">
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:36.854802" 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-28T23:27:36.854471" elapsed="0.000376"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:36.855151" 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-28T23:27:36.854947" elapsed="0.000249"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:36.855489" 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-28T23:27:36.855290" elapsed="0.000233"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:36.855823" 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-28T23:27:36.855622" elapsed="0.000233"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:36.856157" 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-28T23:27:36.855951" elapsed="0.000240"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:36.856536" 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-28T23:27:36.856296" elapsed="0.000457"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:36.857139" 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-28T23:27:36.856879" elapsed="0.000305"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:36.857559" 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-28T23:27:36.857306" elapsed="0.000296"/>
</kw>
<kw name="Set Global Variable" owner="BuiltIn">
<msg time="2026-05-28T23:27:36.858025" 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-28T23:27:36.857746" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-05-28T23:27:36.854217" elapsed="0.003904"/>
</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-28T23:27:36.858310" elapsed="0.000028"/>
</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-28T23:27:36.858459" 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-28T23:27:36.858599" elapsed="0.000022"/>
</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-28T23:27:36.858725" 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-28T23:27:36.858843" 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-28T23:27:36.858960" elapsed="0.000028"/>
</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-28T23:27:36.859094" elapsed="0.000022"/>
</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-28T23:27:36.859218" 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-28T23:27:36.859335" elapsed="0.000017"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:36.858173" elapsed="0.001212"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:36.853494" elapsed="0.005920"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:36.859751" 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-28T23:27:36.859536" elapsed="0.000273"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:36.860374" 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-28T23:27:36.859922" elapsed="0.000752"/>
</kw>
<arg>${cli_env}</arg>
<doc>设置测试环境，支持多环境配置</doc>
<status status="PASS" start="2026-05-28T23:27:36.852890" elapsed="0.007920"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-05-28T23:27:36.861061" level="INFO">测试环境初始化完成</msg>
<arg>测试环境初始化完成</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-05-28T23:27:36.860946" elapsed="0.000159"/>
</kw>
<doc>初始化测试环境，设置默认配置</doc>
<status status="PASS" start="2026-05-28T23:27:36.850725" elapsed="0.010436"/>
</kw>
<test id="s1-s4-s2-s7-t1" name="获取最近交易记录" line="7">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:36.862868" 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-28T23:27:36.862622" elapsed="0.000272"/>
</kw>
<kw name="获取统一请求头" owner="common">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-05-28T23:27:36.864664" 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-28T23:27:36.864018" elapsed="0.000673"/>
</kw>
<if>
<branch type="IF" condition="'${token}' != '${EMPTY}'">
<kw name="Set To Dictionary" owner="Collections">
<arg>${headers}</arg>
<arg>authorization=Bearer ${token}</arg>
<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-28T23:27:36.865629" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-05-28T23:27:36.864829" elapsed="0.000897"/>
</branch>
<status status="PASS" start="2026-05-28T23:27:36.864800" elapsed="0.000956"/>
</if>
<return>
<value>&amp;{headers}</value>
<status status="PASS" start="2026-05-28T23:27:36.865800" elapsed="0.000041"/>
</return>
<msg time="2026-05-28T23:27:36.866089" 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-28T23:27:36.863189" elapsed="0.002925"/>
</kw>
<kw name="发送GET请求" owner="common">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-05-28T23:27:37.260455" 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-28T23:27:37.260667" 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 15:27:37 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': 'a02e48d1cccdf277-NRT'} 
 body=xxx 
 </msg>
<msg time="2026-05-28T23:27:37.260798" level="INFO">/Users/lihu/Library/Python/3.9/lib/python/site-packages/urllib3/connectionpool.py:1064: InsecureRequestWarning: Unverified HTTPS request is being made to host '127.0.0.1'. Adding certificate 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-28T23:27:37.261349" 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-28T23:27:36.866765" elapsed="0.394888">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-28T23:27:37.261865" elapsed="0.000068"/>
</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-28T23:27:36.866347" elapsed="0.395804">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-28T23:27:37.262680" elapsed="0.000064"/>
</kw>
<kw name="验证响应包含字段" owner="common">
<arg>${response}</arg>
<arg>data</arg>
<doc>验证响应JSON包含指定字段</doc>
<status status="NOT RUN" start="2026-05-28T23:27:37.262952" elapsed="0.000040"/>
</kw>
<kw name="完整输出JSON响应" owner="common">
<arg>${response}</arg>
<doc>输出纯净JSON数据</doc>
<status status="NOT RUN" start="2026-05-28T23:27:37.263196" 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-28T23:27:37.263460" elapsed="0.000029"/>
</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-28T23:27:37.263655" elapsed="0.000027"/>
</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-28T23:27:37.263868" elapsed="0.000027"/>
</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-28T23:27:37.264059" elapsed="0.000027"/>
</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-28T23:27:37.264337" elapsed="0.000032"/>
</kw>
<doc>验证最近交易记录接口功能</doc>
<tag>market</tag>
<status status="FAIL" start="2026-05-28T23:27:36.861264" elapsed="0.403351">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-28T23:27:36.845465" elapsed="0.419565"/>
</suite>
<status status="FAIL" start="2026-05-28T23:27:30.749684" elapsed="6.517228"/>
</suite>
<status status="FAIL" start="2026-05-28T23:27:28.769425" elapsed="8.498772"/>
</suite>
<status status="FAIL" start="2026-05-28T23:27:07.860542" elapsed="29.408703"/>
</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>
