2009-11-12 8 views
2

Marathon 2.0b4를 사용하여 응용 프로그램 테스트를 자동화하고 있습니다.루프 내 자이 썬 예외 처리

wait_p 마라톤 의해 제공되는 스크립트 요소의 하나의 단점은, 기본 제한 시간 60 초로를 하드 코드이다. 내 응용 프로그램에서 긴 로딩 시간으로 인해 더 큰 시간 제한이 필요했습니다.
[그래서 더 나은 솔루션이 실제로 테스트 스크립트 수준에서 해결 될 것이라고 생각, 마라톤 패치 간주하지만, 등 병렬 버전을 유지하고 싶지 않았다.]

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가 "에 대한 짧은 wait 속성은 "이고 3 개의 강제 인수와 하나의 선택적 인수 (인수의 이름은 다소 설명이 필요함)를 사용하며 지정된 구성 요소의 특정 속성이 지정된 값과 같아지기를 기다립니다.

위의 메소드 (자이 썬)가 의도하는 것은 times이라는 하나의 추가 매개 변수를 취하는 것으로, 마지막 시도까지 예외를 억제하고 wait_p을 시도하는 횟수를 지정합니다.

그러나이 방법은 저에게 효과적이지 않으며 어딘가에서 구문 적 또는 논리적 오류가있을 수 있습니다. 파이썬/자이 썬 전문가의 의견이 있으십니까?

감사합니다.

답변

2

두 가지 :

  • range(1, times) 거의 확실 range(times)을해야한다; 당신이 쓴 것은 for (int i=1; i < times; i++)
  • 에 해당 난 그냥 설명 어떤이 문제에 도움이되지 않는 경우, if (i < times) 항상 except 블록

True되기 때문으로, 결과는 다른 방법을 정확히 설명해주십시오 당신이 기대하는 것에서.

결과는 같을 것이다 :

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" 
+0

지금은 그런 n00b처럼 느껴집니다! 1) 범위 (1, times)를 범위 (times)로 변경하고 2) if (i bguiz

3

행크의 설명은 정확하지만 나는 다른 접근 방식 제안 @ : (

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이 루프에서 실행되지 않으면 btw가 실행됩니다.

+0

알렉스에게 감사하지만, 나는 행크의 해결책을 선호한다고 생각한다. +1 당신을 위해 아직도! – bguiz

+0

좋습니다. 그러나 현재 코딩 된 해결책은 버그가 있습니다. 중복되는 괄호 외에는'if (i == times) :'테스트가 결코 만족되지 않으므로'raise'가 결코 발생하지 않습니다. 요점은이 특정 버그가 아닙니다. 물론 수정 될 수 있습니다. 여러분과 행크가 사용하고있는 코딩 종류는 ** 버그 발생 가능성이 높습니다 ** - 별개의 버그가 너무 쉽습니다.내가 제안하는 방식 (그리고 +1, btw에 대한 감사)을 코딩하는 것은 버그가 발생하기가 쉽지 않기 때문에 선호합니다 .--). 수십 년을주고, 당신은 어떤 숙어와 접근법이 버그가 덜 발생하는지 ** 배울 것이며, **는 그것들을 선호 할 것입니다! -) –

+0

@Alex가 버그를 지적 해 주셔서 감사합니다; 나는 바로 그 문제를 해결할 것이다. 기록을 위해 나는 당신의 접근 방식을 더 좋아하지만 최소한의 개념 변화로 작동하도록 bguiz의 예를 얻으려고했습니다. –