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

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

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

Это метод, который я написал, чтобы достичь того, что я хочу:

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

    url = conf_object.config_map('TFS')['url'] + "IRT/_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
}

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

Любая помощь будет оценена. Спасибо!

0 ответов

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

В основном, что нужно было изменить, чтобы:

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