API TFS 2018 (версия 4.1) - Python: не удается добавить вложение в результате запуска с использованием версии 4.1 или 5.1 - PullRequest
0 голосов
/ 06 февраля 2019

Мне удалось отправить результаты теста из сценария Python для автоматизации на TFS 2018, создав прогон и добавив в него результаты.

Теперь я пытаюсь загрузить созданный мной xml-файл с подробными результатами выполнения теста, используя вызов API Создать результат теста .Насколько мне известно, версия нашего API - 4.1, а не 5.1.

Это метод, который я написал для достижения желаемого:

def add_result_attachment(result_id, run_id, filename, stream, conf_object):    

    url = conf_object.config_map('TFS')['url'] + "TFS/_apis/test/Runs/" + str(run_id) + "/Results/" + str(result_id) + "/attachments"

    payload = "{\n    \"attachmentType\": \"GeneralAttachment\",\n    \"fileName\": \"" + filename + "\",\n    \"stream\": \"" + str(stream) + "\",\n    \"comment\": \"Test\"\n}"

    # specify version of tfs and its rest api
    query_string = {"api-version": "5.1-preview"}

    headers = {
        'Content-Type': "application/json",
        'Authorization': MYKEY
    }

    requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

    response = requests.request("POST", url, data=payload, headers=headers, params=query_string,  verify=False)

    print(str(response.status_code) + "\n" + json.dumps(json.loads(response.text), indent=4) + '\n')

Я проверил, чтоURL дает мне правильные идентификаторы, поэтому он действителен.filename содержит абсолютный путь к xml-файлу, который я создаю с помощью моей команды pytest.

stream содержит строку закодированной в base64 формы этого xml-файла.

Когда я выполняюэто я получаю в ответ:

Traceback (most recent call last):
  File "C:\Users\marialena\source\repos\UI-Tester\test_signin.py", line 210, in tearDown
    tfs_api.tfs_api.tfs_process(run_start_time, run_completed_time, class_name, method_name, steps, self.outcome)
  File "C:\Users\marialena\source\repos\UI-Tester\tfs_api.py", line 263, in tfs_process
    tfs_api.send_run_results(run_start_time, run_completed_time, json_test_cases['id'], test_name, outcome)
  File "C:\Users\marialena\source\repos\UI-Tester\tfs_api.py", line 586, in send_run_results
    tfs_api.add_result_attachment(result_id, run_id, filename, stream, conf_object)
  File "C:\Users\marialena\source\repos\UI-Tester\tfs_api.py", line 457, in add_result_attachment
    print(str(response.status_code) + "\n" + json.dumps(json.loads(response.text), indent=4) + '\n')
  File "C:\Users\marialena\AppData\Local\Programs\Python\Python37\lib\json\__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "C:\Users\marialena\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\marialena\AppData\Local\Programs\Python\Python37\lib\json\decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 2 column 1 (char 2)

Если я поменяю 5.1-preview на 4.1-preview для версии, я получу код состояния 400 и следующий ответ:

{
    "$id": "1",
    "innerException": null,
    "message": "Value cannot be null.\r\nParameter name: attachmentRequestModel",
    "typeName": "System.ArgumentNullException, mscorlib",
    "typeKey": "ArgumentNullException",
    "errorCode": 0,
    "eventId": 0
}

IsЕсть ли способ решить проблему с версией 4.1, если она поддерживается этим вызовом, или каким-либо образом использовать 5.1, даже если у нас нет последней версии TFS?Я также попытался отправить приложение к самому прогону вместо его результата, но и с этим не повезло.

Буду признателен за любую помощь.Спасибо!

1 Ответ

0 голосов
/ 17 мая 2019

Если кому-то все еще интересно, кто-то ответил на мой вопрос здесь .

В основном необходимо было изменить:

  • использовать более простой путь в корне проекта => TestsOut.log
  • преобразовать stream впо-другому => stream = str(base64.b64encode(data), 'utf-8')
...