Ожидайте ошибки в пользовательском ключевом слове, используя встроенную функцию в Robot Framework - PullRequest
1 голос
/ 03 мая 2019

У меня есть следующий пример ключевого слова в моей пользовательской библиотеке Robot Framework, которая использует встроенную библиотеку Robot Framework для вызова другого ключевого слова в последовательности тестирования с использованием параметров:

# MyLibrary.py
from robot.libraries.BuiltIn import BuiltIn

class MyLibrary(object):
    def run_a_keyword(self, keywordName):
        builtinLib = BuiltIn().get_library_instance("BuiltIn")
        parameters = ['hi', 'second param']
        # Runs the keyword with the given parameters
        builtinLib.run_keyword(keywordName, *parameters)

Я бы запустил, например, следующую упрощеннуюtest, чтобы проверить, что ключевое слово работает со свойством, также проверяя ошибки:

*** Settings ***
Library MyLibrary.py

*** Test Cases ***
Test Case
    Run A Keyword   My Keyword
    Run Keyword And Expect Error    Keyword 'Another Keyword' expected 3 arguments, got 2.  Run A Keyword   Another Keyword

*** Keywords ***
My Keyword
    [Arguments] ${arg1} ${arg2}
    Log To Console  Keyword Executed 

Another Keyword
    [Arguments] ${arg1} ${arg2} ${arg3}
    Log To Console  Keyword Executed

Я ожидаю, что этот контрольный пример пройдёт, но контрольный пример не пройдёт на втором шаге сRun Keyword and Expect Error несмотря на то, что я заявил, что ошибка ожидалась?

Мой обходной путь для этого заключался в том, чтобы перехватить исключение, вызванное вызовом builtInLib внутри моего ключевого слова, и повторно выдать его, после этого последовательность тестирования с Run Keyword And Expect Errorработает правильно:

def run_a_keyword(self, keywordName):
        builtinLib = BuiltIn().get_library_instance("BuiltIn")
        parameters = ['hi', 'second param']
        try:
            builtinLib.run_keyword(keywordName, *parameters)
        except Exception as err:
            raise Exception(err.message)

Однако мне нужен слушатель для передачи ошибок в службу:

class MyListener(object):
    ROBOT_LISTENER_API_VERSION = 2
    ROBOT_LIBRARY_SCOPE = 'GLOBAL'

    def __init__(self):
        self.ROBOT_LIBRARY_LISTENER = self

    def log_message(self, message):
        level = message['level']
        if level == 'FAIL':
            send_the_error_to_somewhere(message['message'])

log_message вызывается дважды (когда встроенная функцияпозвонил и когда подниму новое исключение).Это приводит к тому, что одна и та же ошибка будет обрабатываться и регистрироваться дважды, что не то, что я хочу.

Итак: Как я могу Run Keyword And Expect Error с ключевым словом, которое вызывает встроенную функцию и до сих поробработать ошибку только один раз?

1 Ответ

2 голосов
/ 04 мая 2019

Прежде всего, Run Keyword And Expect Error не обрабатывает синтаксические ошибки - см. Его документацию, в нем четко указано, в конце, и также его реализация - эта ошибка относится к категории dont_continue.
Вы передаете 2 аргумента ключевому слову, имеющему 3 обязательных параметра, что явно является синтаксической ошибкой.


Почему log_message вызывается / запоминает ошибку дважды? Потому что возникают два исключения - одно во встроенном ключевом слове RF, а затем, когда вы ререйзируете его в своем. Фреймворк регистрирует фатальный уровень в каждом исключении, таким образом, вы получаете 2.

Первое решение, которое приходит мне в голову, - это связаться с вашим обработчиком журналов с помощью самого сообщения content .
Самым оптимальным миром решений было изменение исключения, скажем, добавление атрибута «производитель» с установленным значением к нему и проверка в обработчике hasattr(err, 'producer'), но он больше не имеет доступа к исключению, просто чтобы текст сообщения. Префикс сообщения об ошибке со специальным идентификатором:

except Exception as err:
            raise Exception("SPECIAL_IDENTIFIER:{}".format(err.message))

, а затем send_the_error_to_somewhere, только если он имеет:

if level == 'FAIL' and message['message'].startswith('SPECIAL_IDENTIFIER:'):
            # get rid of the special identifier prefix, and then
            send_the_error_to_somewhere(message['message'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...