如何调用已在当前运行的测试CA范围内的库实例的方法

2024-06-16 10:10:07 发布

您现在位置:Python中文网/ 问答频道 /正文

在这个包中实现了一个更复杂的关键字库,并把它作为一个扩展的工具来实现。包被赋予了测试用例范围,但我不完全确定这是如何工作的。如果我提出一些我想到的方法,能不能有一个知识多一点的人让我知道我在哪条路上走对了路,我在哪里找错了树。。。在

  1. 使用实例变量-如果范围是这样的,python解释器将看到当前测试用例导入的包(即在不同的测试用例中,这被视为一个单独的包,而不是同一个包的单独实例),然后在初始化时,我可以将一个全局变量INSTANCE设置为self,然后从包中的另一个模块导入{}并使用它。

  2. 使用实例字典-如果范围是这样的,所有导入都会看到相同的包,我可以利用robot.running.context设置一个字典键,以便在导入包的每个上下文的实例字典中都有一个项-这意味着我可以在基于此的模块中使用相同的上下文变量作为查找键。(这种方法的缺点是,它将阻止垃圾收集,直到包本身超出范围,并且依赖于它一直处于作用域内。)

  3. 一个我还没有意识到的上下文变量将给我一个范围内的实例。这些文档很难搜索,所以很有可能我遗漏了一些东西,这会让这件事变得微不足道。同样好的是,我可以调用范围内的关键字。

  4. 一些我没有考虑过的可能性。。。。

有人能帮忙吗?在


Tags: 模块工具实例方法instanceself利用字典
2条回答

听起来好像您在谈论monkeypatching导入的代码,因此导入该包的其他模块也将看到您的运行时修改。(如果我错了,请纠正我;你的问题中有几点我没有完全听懂)

对于简单的包导入,这应该可以:

import my_package

def method_override():
    return "Foo"

my_package.some_method = method_override

在本例中,my_package引用导入的模块,而不仅仅是本地名称,因此其他模块将看到重写的方法。在

这在其他代码已经完成的情况下不起作用

^{pr2}$

因为在这种情况下,some_method是导入位置的本地名称。如果在其他地方替换该方法,则不会看到该更改。在

如果发生这种情况,则需要更改源代码以导入整个模块,或者通过替换方法内部构件来修补更深一点的内容:

import my_package

def method_override():
    return "Foo"

my_package.some_method.func_code = method_override.func_code

此时,该方法在任何其他模块中是如何导入的都无关紧要;与该方法关联的code对象已被替换,新代码将运行,而不是原来的代码。在

在这种情况下,唯一需要担心的是,在每种情况下,模块都是从同一路径导入的。Python解释器将尝试重用现有模块,而不是重新导入和重新初始化它们,只要它们是从同一路径导入的。在

但是,如果您的python路径设置为包含两个目录,例如:'/foo'和'/foo/bar',那么这两个导入

from foo.bar import baz

以及

from bar import baz

最终将加载模块两次,并在模块中定义任何对象(方法、类等)的两个版本。如果发生这种情况,那么修补其中一个不会影响另一个。在

如果你需要防范这种情况,那么你可能需要穿越系统模块,查找导入的包,并修补找到的每个版本。当然,只有在所有其他导入都已经发生的情况下,这才有效,您不能先发制人(不编写导入钩子,但这又是一个更深层次的问题:)

你确定你不能把原来的包分叉直接扩展吗?这样会容易得多:)

这归功于来自robotframework用户组的Kevin O,但本质上魔法存在于robot.libraries.BuiltIn.BuiltIn().get_library_instance(library_name)中,可以这样使用:

from robot.libraries.BuiltIn import BuiltIn
class SeleniumTestLibrary(object):
  def element_should_be_really_visible(self):
    s2l = BuiltIn().get_library_instance('Selenium2Library')
    element = s2l._element_find(locator, True, False)

相关问题 更多 >