在 python 子进程或线程或进程中保留 class 运行
Keep a class running in a python subprocess or thread or process
我正在使用 Squish 来自动化基于 Qt 的 GUI 应用程序。我递归地在应用程序中查找 qt 对象。由于它是时间密集型的,我想缓存一旦找到的对象供以后重用。我有以下 class 来维护字典中的对象缓存 -
def __init__(self):
self.object_store = {}
@staticmethod
def instance():
if '_instance' not in ObjectCache.__dict__:
ObjectCache._instance = ObjectCache()
return ObjectCache._instance
def set(self, object_name, obj):
self.object_store[object_name] = obj
def remove(self, object_name):
del self.object_store[object_name]
def exists(self, object_name):
if object_name in self.object_store:
return True
return False
def get(self, object_name):
return self.object_store[object_name]
def get_all(self):
return self.object_store
我的自动化脚本中的函数有以下装饰器,从这本字典到 add/access/delete -
def object_caching_decorator(func):
def wrapper(*args, **kwargs):
object_cache = ObjectCache.instance()
if object_cache.exists(func.__name__):
try:
if waitForObject(object_cache.get(func.__name__)):
return object_cache.get(func.__name__)
except LookupError:
object_cache.remove(func.__name__)
obj = func(*args, **kwargs)
object_cache.set(func.__name__, obj)
return obj
return wrapper
有人可能会问为什么不能所有的脚本共享这个 class 对象?因为 Squish 工具在开始每个测试脚本之前重置了全局符号 table 因此我需要一种方法来保留这个对象。
如何保留此 class 运行 以便另一个进程(Squish runner)上的脚本 运行 可以无缝访问它?
每个 Squish 测试用例都在 squishrunner 的新实例(进程)和托管在其中的脚本解释器中执行。
Squish 在测试脚本中为您提供的对象引用实际上是代理对象,它们透明地(在幕后)为您访问应用程序内部的实际对象,您无需为此“魔法”做任何事情发生(或意识到,大多数时候)。 Caching/persisting 跨测试用例的这些对象将不起作用,也不可能。
此外,缓存对象引用是一个臭名昭著的问题,因为如果 AUT(被测应用程序)发生变化或以不同方式使用,这些代理对象引用的对象的 life-time 可能会发生变化。
相反,您应该重新审视查找对象的方式。很可能有更好的方法允许 ad-hoc 对象查找(如预期的那样)足够快。 (如果有疑问,我建议联系 Squish 的供应商,因为您的维护合同或订阅他们的产品使您有权获得技术支持。)
我正在使用 Squish 来自动化基于 Qt 的 GUI 应用程序。我递归地在应用程序中查找 qt 对象。由于它是时间密集型的,我想缓存一旦找到的对象供以后重用。我有以下 class 来维护字典中的对象缓存 -
def __init__(self):
self.object_store = {}
@staticmethod
def instance():
if '_instance' not in ObjectCache.__dict__:
ObjectCache._instance = ObjectCache()
return ObjectCache._instance
def set(self, object_name, obj):
self.object_store[object_name] = obj
def remove(self, object_name):
del self.object_store[object_name]
def exists(self, object_name):
if object_name in self.object_store:
return True
return False
def get(self, object_name):
return self.object_store[object_name]
def get_all(self):
return self.object_store
我的自动化脚本中的函数有以下装饰器,从这本字典到 add/access/delete -
def object_caching_decorator(func):
def wrapper(*args, **kwargs):
object_cache = ObjectCache.instance()
if object_cache.exists(func.__name__):
try:
if waitForObject(object_cache.get(func.__name__)):
return object_cache.get(func.__name__)
except LookupError:
object_cache.remove(func.__name__)
obj = func(*args, **kwargs)
object_cache.set(func.__name__, obj)
return obj
return wrapper
有人可能会问为什么不能所有的脚本共享这个 class 对象?因为 Squish 工具在开始每个测试脚本之前重置了全局符号 table 因此我需要一种方法来保留这个对象。
如何保留此 class 运行 以便另一个进程(Squish runner)上的脚本 运行 可以无缝访问它?
每个 Squish 测试用例都在 squishrunner 的新实例(进程)和托管在其中的脚本解释器中执行。
Squish 在测试脚本中为您提供的对象引用实际上是代理对象,它们透明地(在幕后)为您访问应用程序内部的实际对象,您无需为此“魔法”做任何事情发生(或意识到,大多数时候)。 Caching/persisting 跨测试用例的这些对象将不起作用,也不可能。
此外,缓存对象引用是一个臭名昭著的问题,因为如果 AUT(被测应用程序)发生变化或以不同方式使用,这些代理对象引用的对象的 life-time 可能会发生变化。
相反,您应该重新审视查找对象的方式。很可能有更好的方法允许 ad-hoc 对象查找(如预期的那样)足够快。 (如果有疑问,我建议联系 Squish 的供应商,因为您的维护合同或订阅他们的产品使您有权获得技术支持。)