如何使用 Python“请求”和 API 密钥将 RobotFramework 测试结果导入 XRAY?

时间:2021-07-16 20:57:45

标签: jira-xray

我想写一个 requests 程序而不是 curl 命令来导入测试执行结果。

以下 curl 命令非常适合我,唯一的问题是我需要在机器人执行完成后手动运行它并且还需要使用我的登录凭据:

curl -H "Content-Type: multipart/form-data" -u adminuser:adminpassword -F "file=@output.xml" "https://<xrayurl>/rest/raven/1.0/import/execution/robot?projectKey=TEST&testEnvironments=SIT1&testPlanKey="TEST-25"

我尝试执行以下操作,并在多次尝试失败后终于成功:

import requests
params = (('projectKey', 'TEST'),)
files = {'file': ('output.xml', open(r'C:\workspace\Results\output.xml', 'rb')),}

response = requests.post('https://<xrayurl>/rest/raven/1.0/import/execution/robot', params=params, files=files, auth=('adminuser', 'adminpassword'))

提前感谢您的帮助/指导。我会继续尝试选项并在找到答案后发布答案。

2 个答案:

答案 0 :(得分:1)

首先,澄清一下,Xray Cloud 和 Xray Server/数据中心是不同的产品,具有不同的 API(Xray Server/DC REST APIXray Cloud REST API)。发生这种情况的原因有很多,其中包括 Jira Cloud 和 Jira 服务器是具有不同功能的不同产品。 话虽如此,让我分享一些 Xray 服务器/DC 和 Xray Cloud 的示例。

Xray 服务器/数据中心

以下代码片段展示了如何使用 HTTP 基本身份验证以及另一种方法提交结果,即使用最近添加到 Jira 数据中心且 Xray 也支持的个人访问令牌。

import requests
 
jira_base_url = "http://192.168.56.102"
jira_username = "admin"
jira_password = "admin"
personal_access_token = "OTE0ODc2NDE2NTgxOnrhigwOreFoyNIA9lXTZaOcgbNY"


# endpoint doc for importing Robot Framework XML reports: https://docs.getxray.app/display/XRAY/Import+Execution+Results+-+REST#ImportExecutionResultsREST-RobotFrameworkXMLresults
params = (('projectKey', 'CALC'),('fixVersion','v1.0'))
files = {'file': ('output.xml', open(r'output.xml', 'rb')),}

# importing results using HTTP basic authentication
# response = requests.post(f'{jira_base_url}/rest/raven/2.0/import/execution/robot', params=params, files=files, auth=(jira_username, jira_password))

# importing results using Personal Access Tokens 
headers = {'Authorization': 'Bearer ' + personal_access_token}
response = requests.post(f'{jira_base_url}/rest/raven/1.0/import/execution/robot', params=params, files=files, headers=headers)

print(response.status_code)
print(response.content)

X 射线云

import requests
import json

xray_cloud_base_url = "https://xray.cloud.xpand-it.com/api/v2"
client_id = "215FFD69FE4644728C72182E00000000"
client_secret = "1c00f8f22f56a8684d7c18cd6147ce2787d95e4da9f3bfb0af8f02ec00000000"

# endpoint doc for authenticating and obtaining token from Xray Cloud: https://docs.getxray.app/display/XRAYCLOUD/Authentication+-+REST+v2
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
auth_data = { "client_id": client_id, "client_secret": client_secret }
response = requests.post(f'{xray_cloud_base_url}/authenticate', data=json.dumps(auth_data), headers=headers)
auth_token = response.json()
print(auth_token)

# endpoint doc for importing Robot Framework XML reports: https://docs.getxray.app/display/XRAYCLOUD/Import+Execution+Results+-+REST+v2#ImportExecutionResultsRESTv2-RobotFrameworkXMLresults
params = (('projectKey', 'BOOK'),('fixVersion','1.0'))
report_content = open(r'output.xml', 'rb')
headers = {'Authorization': 'Bearer ' + auth_token, 'Content-Type': 'application/xml'}
response = requests.post(f'{xray_cloud_base_url}/import/execution/robot', params=params, data=report_content, headers=headers)

print(response.status_code)    
print(response.content)

答案 1 :(得分:0)

我找到了一种无需密码即可使用基本身份验证方法的方法。以下是我遵循的步骤:

从我的 XRAY 配置文件中生成密钥 - 将其保存在安全的地方。

enter image description here

按照页面上的说明进行操作:https://wiki.resolution.de/doc/api-token-authentication/latest/user-guide/using-tokens-examples?#id-.UsingTokensExamplesv1.7.0-Python

生成了一个基本的身份验证标头生成器,我在其中提供了我的用户名和从 JIRA 生成的 api_key。显然这个网页是在文档页面中推荐的: https://www.blitter.se/utils/basic-authentication-header-generator/

您可以使用上面的页面,也可以使用下面的基本 python 代码段将字符串转换为您的基本授权密钥。它隐藏了您的凭据,但您仍然可以通过解码找到您的 api_key:

from base64 import urlsafe_b64encode as b64e   
string_to_encode = f"{username}:{api_key}"
encoded_value = b64e(bytearray(string_to_encode, encoding='utf-8'))

我的下一个方法是找出不记名令牌方法。但由于某种原因,我还无法弄清楚这个过程。如果我能解决它,我会继续更新这个线程。

import requests
import codecs
params = {'projectKey': 'TEST', 'testPlanKey':'TEST-31', 'testEnvironments': 'SIT'}
with codecs.open(r'C:\workspace\Results\output.xml') as fin:
    content = fin.read()
files = {'file': ('output.xml', content)}
api_token = encoded_value 
api_header = {'Authorization': 'Basic {}'.format(api_token)}
response = requests.post('https://<xrayurl>/rest/raven/1.0/import/execution/robot', params=params, headers=api_header, files=files, verify=False)  # Remove verify=False after you do the necessary SSL certs
print(response.status_code)
print(response.text)
相关问题