2009-11-12 177 views
2

我正在使用Marathon 2.0b4来自动化应用程序的测试。循环内的Jython异常处理

作为Marathon提供的脚本元素之一,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是短期的"等待属性",它需要3个强制参数和一个可选参数(参数的名称相当明了),它所做的是等待指定组件的特定属性等于指定值。

上面的方法(Jython)打算做的是采取一个额外的参数,times,它指定了尝试次数wait_p,抑制异常直到最后一次尝试。

但是,这种方法不适合我,恐怕在那里可能会出现一些语法或逻辑错误。来自python/jython大师的任何评论?

谢谢!

回答

2

两件事情:

  • range(1, times)几乎应该是range(times);你所写的是相当于for (int i=1; i < times; i++)
  • 因为我刚才解释,if (i < times)永远是Trueexcept

如果这不符合您的问题有所帮助,请说明如何准确的结果不同从你的期望。

结果看起来是这样的:

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)将'range(1,times)'改为'range(times)'并且2)将if(i bguiz 2009-11-12 01:54:04

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上做一些不同的“最后一次”检查)。如果循环中没有执行break,则循环中的else子句执行,btw。

+0

感谢Alex,但我认为我更喜欢Hank的解决方案。 +1还是你! – bguiz 2009-11-12 03:49:01

+0

好的,但目前编码的解决方案是错误的 - 测试'if(i == times):',除了多余的括号,永远不会被满足,所以'raise'永远不会发生。关键不在于这个特定的错误,当然这个错误是可以修复的:这就是说,你和Hank使用的编码类型是**容易发生的错误** - 错过这个错误太容易了。按照我建议的方式编码(并感谢+1,btw)只是不太容易出错 - 这就是为什么您应该更喜欢它;-)。给它几十年,你会知道哪些成语和方法不太容易出错**和**会更喜欢它们!) – 2009-11-12 04:19:42

+0

@亚历克斯感谢您指出错误;我会立即解决这个问题。为了记录,我更喜欢你的方法,但试图让bguiz的例子在最小的概念变化下工作。 – 2009-11-12 12:25:09