Обработка исключений в Jython внутри циклов - PullRequest
2 голосов
/ 12 ноября 2009

Я использую Marathon 2.0b4 для автоматизации тестов приложения.

Недостаток wait_p, одного из элементов сценария, предоставляемого Marathon, заключается в том, что его таймаут по умолчанию составляет в жестком коде и составляет 60 секунд. Мне потребовалось большее время ожидания из-за длительного времени загрузки моего приложения.
[Я рассматривал возможность установки исправлений Marathon, но не хотел поддерживать параллельные версии и т. Д., Поэтому решил, что лучшим решением будет обходной путь на уровне тестового сценария.]

def wait_p_long(times, compID_name, ppty_name, ppty_value, compID_cell=None):
    from marathon.playback import *
    """Wrapper around wait_p which takes exactly the same parameters as wait_p,
    except that an extra first parameter is used to specify the number of times
    wait_p is called"""
    for i in range(1, times):
        try:
            wait_p(compID_name, ppty_name, ppty_value, compID_cell)
        except:
            if (i < times):
                print "wait_p failed, trying again"
            else:
                raise

wait_p - это сокращение от «свойства ожидания», и оно принимает 3 обязательных и один необязательный аргумент (имена аргументов довольно очевидны), и для этого нужно ожидать, чтобы указанное свойство указанного компонента быть равным указанному значению.

То, что намеревался сделать вышеупомянутый метод (Jython), это взять один дополнительный параметр, times, который определяет количество попыток wait_p, исключая исключения вплоть до последней попытки.

Однако этот метод не работает для меня, и я боюсь, что где-то там может быть какая-то синтаксическая или логическая ошибка. Есть какие-нибудь комментарии от python / jython gurus?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 12 ноября 2009

@ Объяснение Хэнка верно, но я бы предложил другой подход:

def wait_p_long(times, compID_name, ppty_name, ppty_value, compID_cell=None):
    from marathon.playback import *
    for i in range(times-1):
        try:
                wait_p(compID_name, ppty_name, ppty_value, compID_cell)
                break
        except:
                pass
     else:  # try one last time...!
         wait_p(compID_name, ppty_name, ppty_value, compID_cell)

Мне кажется, что концептуально проще (хотя текстовое повторение вызова wait_p является минусом, оно избегает проверок на i, чтобы сделать что-то другое "в последний раз"). Предложение else в цикле выполняется, если в цикле никогда не выполняется break, кстати.

2 голосов
/ 12 ноября 2009

Две вещи:

  • range(1, times) почти наверняка должно быть range(times);то, что вы написали, эквивалентно for (int i=1; i < times; i++)
  • Из-за того, что я только что объяснил, if (i < times) всегда будет True в вашем except блоке

Если это не такt, чтобы помочь с вашей проблемой, пожалуйста, опишите, насколько точно ваши результаты отличаются от ожидаемых.

Результаты будут выглядеть примерно так:

def wait_p_long(times, compID_name, ppty_name, ppty_value, compID_cell=None):
    from marathon.playback import *
    """
    Wrapper around wait_p which takes exactly the same parameters as wait_p,
    except that an extra first parameter is used to specify the number of times
    wait_p is called.
    """
    for i in range(times):
        try:
            wait_p(compID_name, ppty_name, ppty_value, compID_cell)
        except:
            if i == times - 1:
                raise
            else:
                print "wait_p failed, trying again"
...