Создание копии файла output.xml Robot Framework в конвейере Jenkins

Я занимаюсь созданием шаблона электронной почты Groovy для конвейера Jenkins, на котором выполняются тесты Robot Framework. Я собираюсь использовать Groovy XMLSlurper для анализа output.xml, созданного Jenkins, для извлечения нужной мне информации. Однако шаблон также основан на использовании Robot Publisher, который, как я понял, автоматически удаляет output.xml. Я бы предпочел не архивировать артефакты и получать к ним доступ таким образом, поэтому есть ли способ создать копию output.xml в конвейере Jenkins перед этапом Robot Publisher, который не будет удален Robot Publisher, что я может анализировать на этапе моей электронной почты?

Пожалуйста, терпите меня, так как я относительно новичок в Jenkins (и stackoverflow в этом отношении), поэтому извиняюсь, если я исключил важную информацию, но любые идеи будут очень признательны! Спасибо


person BMuell    schedule 18.09.2020    source источник
comment
Привет и добро пожаловать в SO. Прочтите Как задать вопрос, а затем попытайтесь улучшить свой вопрос, отредактировав его, сосредоточив внимание на конкретной проблеме и предоставив подробную информацию о это (код, конфигурация, сообщения об ошибках, точная проблема, с которой вы столкнулись.   -  person Sourav Atta    schedule 19.09.2020


Ответы (1)


Я бы подошел к вашей проблеме под другим углом. Прежде всего, я не предлагаю использовать Groovy XMLSlurper или любой другой синтаксический анализатор XML для извлечения необходимой информации из output.xml Robot Framework.

Вам следует использовать собственный API Robot Framework, который уже реализует нужные вам парсеры. Вы можете легко получить доступ к любой информации, описанной в модуль robot.result.model. Здесь вы можете найти все, наборы, тесты и ключевые слова со всеми их атрибутами, такими как тестовые сообщения, сообщения об ошибках, время выполнения, результаты тестов и т. Д. В целом это будет наиболее перспективным решением синтаксического анализа в будущем, поскольку этот синтаксический анализатор всегда будет соответствовать версия фреймворка. Убедитесь, что вы используете документацию API, соответствующую вашей текущей версии фреймворка.

Теперь вернемся к своей задаче: вы должны использовать вышеупомянутый API через интерфейс слушателя Robot Framework.. Реализуя метод output_file прослушивателя , вы можете получить доступ к output.xml (вы даже можете сделать его копию здесь) до того, как плагин Robot Publisher переместит файл. output_file будет автоматически вызываться после того, как output.xml будет готов. Метод получит в качестве входных данных путь к XML-файлу. Вы можете передать этот путь прямо в ExecutionResult класс из API, после чего вы сможете просмотреть результаты своим ResultVisitor и получить необходимую информацию.

Последним шагом будет запись данных в файл, который будет использоваться в качестве входных данных для этапа электронной почты. Обратите внимание, что этот файл не будет затронут издателем Robot Publisher по умолчанию, поскольку это не стандартный вывод, а пользовательский, который вы только что создали с помощью API Robot Framework.

Как бы много это ни звучало, вот пример, демонстрирующий идею. Слушатель и посетитель результата в EmailInputProvider.py:

from robot.api import ExecutionResult, ResultVisitor

class MyTestResultVisitor(ResultVisitor):

    def __init__(self):
        self.test_results = dict()

    def visit_test(self, test):
        self.test_results[test.longname] = test.status

        
class EmailInputProvider:

    ROBOT_LISTENER_API_VERSION = 3

    def output_file(self, path):
        output = 'EmailInput.txt'
        
        visitor = MyTestResultVisitor()    # Instantiate result visitor
        result = ExecutionResult(path)     # Parse up execution result using robot API
        result.visit(visitor)              # Visit and top level suite to retrive needed metadata
        
        with open(output, 'w') as f:       # Write retrived data into a file
            for testname, result in visitor.test_results.items():
                print(f'{testname} - {result}', file=f)

        # You can make a copy of the output.xml here as well
        print(f'Email:   Input saved into {output}') # Log about custom output to console

globals()[__name__] = EmailInputProvider

Это даст следующие результаты для этого фиктивного набора (SO2.robot):

*** Test Cases ***
Test A
    No Operation

Test B
    No Operation

Test C
    No Operation

Test D
    No Operation

Test E
    No Operation

Test F
    Fail

Вывод в консоль:

$ robot --listener EmailInputProvider SO2.robot
==============================================================================
SO2
==============================================================================
Test A                                                                | PASS |
------------------------------------------------------------------------------
Test B                                                                | PASS |
------------------------------------------------------------------------------
Test C                                                                | PASS |
------------------------------------------------------------------------------
Test D                                                                | PASS |
------------------------------------------------------------------------------
Test E                                                                | PASS |
------------------------------------------------------------------------------
Test F                                                                | FAIL |
AssertionError
------------------------------------------------------------------------------
SO2                                                                   | FAIL |
6 critical tests, 5 passed, 1 failed
6 tests total, 5 passed, 1 failed
==============================================================================
Email:   Input saved into EmailInput.txt
Output:  ..\output.xml
Log:     ..\log.html
Report:  ..\report.html

Пользовательский выходной файл:

SO2.Test A - PASS
SO2.Test B - PASS
SO2.Test C - PASS
SO2.Test D - PASS
SO2.Test E - PASS
SO2.Test F - FAIL
person Bence Kaulics    schedule 19.09.2020
comment
@BMuell Дайте мне знать, если вам нужны дополнительные разъяснения. - person Bence Kaulics; 22.09.2020