【问题标题】:Jython exception handling within loops循环内的 Jython 异常处理
【发布时间】:2009-11-12 01:21:11
【问题描述】:

我正在使用 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 大师的 cmets 吗?

谢谢!

【问题讨论】:

    标签: python exception-handling jython automated-tests


    【解决方案1】:

    @Hank 的解释是正确的,但我会建议一种不同的方法:

    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 子句执行,顺便说一句。

    【讨论】:

    • 感谢 Alex,但我想我更喜欢 Hank 的解决方案。仍然为你 +1!
    • 好的,但是当前编码的解决方案有问题——测试if (i == times):,除了多余的括号,永远不会满足,所以raise永远不会发生。关键不是这个特定的错误,它当然可以修复:而是你和 Hank 使用的那种编码是容易出错的——太容易出现错误了-一个错误。按照我建议的方式进行编码(感谢 +1,顺便说一句)不太容易出错——这就是为什么你应该更喜欢它的原因;-)。再过几十年,你就会知道哪些习惯用法和方法不太容易出错并且会更喜欢它们!-)
    • @Alex 感谢您指出错误;我会立即解决这个问题。作为记录,我更喜欢你的方法,但试图让 bguiz 的示例以最小的概念变化工作。
    【解决方案2】:

    两件事:

    • range(1, times) 几乎可以肯定是 range(times);你写的相当于for (int i=1; i &lt; times; i++)
    • 由于我刚刚解释过,if (i &lt; 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"
    

    【讨论】:

    • 我现在觉得自己像个n00b!只是为了澄清您的建议:1)将range(1, times)更改为range(times)和2)将if (i &lt; times)更改为if (i &lt; (times -1));为了捕获for循环的最后一次出现?
    猜你喜欢
    • 2016-03-17
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    相关资源
    最近更新 更多